Проверьте, существует ли уникальное значение перед его созданием

Когда Django запускает .save() в атрибуте первичного ключа, он сначала выполняет SELECT, чтобы узнать, существует ли он, а затем решает, следует ли делать INSERT или UPDATE. Есть ли способ элегантно сделать то же самое для уникального, но не первичного ключевого поля?

В принципе, если модель выглядит так:

class Subject(models.Model):
    name = models.CharField(max_length=64, unique=True)

Я хотел бы сделать следующее, не вызывая ошибки

>>> s=Subject(name="A new subject")
>>> s.save()
>>> s
<Subject: A subject>
>>> s=Subject(name="A new subject")
>>> s.save()
--- django.db.utils.IntegrityError: column name is not unique

И наоборот, я мог бы сделать "имя" pk, но я не был уверен в элегантном способе Django, чтобы сделать уникальные автоинкрементные идентификаторы non-pk.

Любая помощь приветствуется. Спасибо!

Ответ 1

Вы можете использовать get_or_create.

s, created = Subject.objects.get_or_create(name="A new subject")

Ответ 2

Вы можете переопределить метод сохранения на этой модели и проверить, существует ли уже сохраненное вами значение:

class Subject(models.Model):
     name = models.CharField(max_length=64, unique=True)

     def save(self, *args, **kwargs):
         #check if value exists / increment something etc

         #continue with save, if necessary:
         super(Subject, self).save(*args, **kwargs)

Ответ 3

`Если вы поместите unique = True в свою модель, когда вы попытаетесь создать объект с таким же уникальным параметром True = True, будет возвращена ошибка, поэтому убедитесь, что вы вызываете их в try-except, чтобы обрабатывать это.