Можно ли сделать так, чтобы только один объект, связанный с другим объектом, имел определенное поле?

У меня есть модель 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",
            ),
        ]
Вернуться на верх