Можно ли сделать так, чтобы только один объект, связанный с другим объектом, имел определенное поле?
У меня есть модель Video, и у нее есть связанные объекты на другой модели Label. Пример здесь:
class Video(models.Model):
pass
class Label(models.Model):
video = models.ForeignKey(Video, related_name="labels")
current = models.NullBooleanField()
Мне нужно иметь возможность найти текущую метку на видео, сделав что-то вроде my_video.labels.filter(current=True), и этот запрос должен возвращать только одну метку, поэтому только одна метка на видео должна иметь поле, установленное в True.
Есть ли способ обеспечить это в модели/базе данных?
Спасибо
Я думаю, что вы можете решить эту проблему с помощью UniqueConstraint.
Используя его, вы можете ограничить, чтобы у видео была только одна метка, которая current == True
Вы можете определить UniqueConstraint в модели Meta.
Вы получите ошибку целостности базы данных при сохранении(), если условие не выполняется.
См. документацию по этому вопросу здесь:
https://docs.djangoproject.com/en/4.0/ref/models/constraints/
class Label(models.Model):
...
class Meta:
constraints = [
models.UniqueConstraint(
fields=["current", "video"],
condition=Q(current=True),
name="unique_current_label",
),
]