Ответ 1
Вы можете использовать get_or_create
.
s, created = Subject.objects.get_or_create(name="A new subject")
Когда 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.
Любая помощь приветствуется. Спасибо!
Вы можете использовать get_or_create
.
s, created = Subject.objects.get_or_create(name="A new subject")
Вы можете переопределить метод сохранения на этой модели и проверить, существует ли уже сохраненное вами значение:
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)
`Если вы поместите unique = True в свою модель, когда вы попытаетесь создать объект с таким же уникальным параметром True = True, будет возвращена ошибка, поэтому убедитесь, что вы вызываете их в try-except, чтобы обрабатывать это.