2013-08-12 2 views
1

У меня есть модель с двумя полями, как показано нижеПриращение слизняка, избегая ошибки целостности в моделях Джанго сохранить метод

models.py

class Publisher(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=150, unique=True)  

    def save(self, *args, **kwargs): 
     if not self.id and not self.slug: 
      slug = slugify(self.name) 
      try: 
       slug_exits = Publisher.objects.get(slug=slug) 
       if slug_exits: 
        self.slug = slug + '_1' 
      except Publisher.DoesNotExist: 
       self.slug = slug 
     super(Publisher, self).save(*args, **kwargs) 

Здесь я создаю слизняка на основе name как мы можем видеть выше

Поэтому, когда мы пытаемся создать издателя с name already exists, метод модели save добавит _1 до конца.

И когда мы снова попытаться создать новую запись с такими же name, Integrity ошибки будет поднята, как показано ниже

>> Publisher.objects.create(name="abc") 
    result: slug will be "abc" 
>> Publisher.objects.create(name="abc") 
    result: slug will be "abc_1" 
>> Publisher.objects.create(name="abc") 
    result: 

    ................. 
    ................. 
    34  del cursor 
    35  del connection 
---> 36  raise errorclass, errorvalue 
    37 
    38 re_numeric_part = re.compile(r"^(\d+)") 

IntegrityError: (1062, "Duplicate entry 'abc_1' for key 'slug'") 

Так что я хочу, если название/пробковое уже существует в базе данных и если пробкового содержит число в ней (в конце, как аЬс _1), мы должны увеличивать его, что число

так что все, что я хочу, чтобы increment the number in the slug, как показано ниже, если название/пробкового уже существует в базе данных

abc 
abc_1 
abc_2 
abc_3 

Так может кто угодно, пожалуйста, дайте мне знать, как реализовать вышеприведенную логику приращения пули?

Заранее спасибо ......

+0

Зачем вам это нужно? Почему бы просто не создать у пользователя уникальное имя пользователя Slook? –

+0

На самом деле slug - это уникальное поле, но когда разработчик или администратор пытается создать его из оболочки python (django), мы должны позаботиться о дублировании –

ответ

2

Вам придется использовать цикл вместо только одно условие. Попробуйте следующее:

class Publisher(models.Model): 
    name = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=150, unique=True)  

    def save(self, *args, **kwargs): 
     if not self.id and not self.slug: 
      slug = slugify(self.name) 
      slug_exists = True 
      counter = 1 
      self.slug = slug 
      while slug_exists: 
       try: 
        slug_exits = Publisher.objects.get(slug=slug) 
        if slug_exits: 
         slug = self.slug + '_' + str(counter) 
         counter += 1 
       except Publisher.DoesNotExist: 
        self.slug = slug 
        break 
     super(Publisher, self).save(*args, **kwargs) 
+0

Я думаю, что эта строка slug = self.slug + '_' + str (counter) должно быть как self.slug = slug + '_' + str (counter) –

+0

Кроме того, это не работает в этом случае, когда я пытался создать издателя с таким же именем, его поражение означает, что цикл не прерывается –

+0

@ shivakrishna, строка не должна быть написана в ответ 'slug = self.slug + '_' + str (counter)'. Вы застряли в коде, который отвечает? – Rohan