Django index unique on where

У меня есть класс, который представляет фотографии, прикрепленные к человеку.

class PersonPhoto(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    photo = models.FileField(upload_to='photos/', blank=True, null=True)
    person = models.ForeignKey(
        Person, related_name="photos", on_delete=models.CASCADE
    )
    main = models.BooleanField(default=False)

Я хочу убедиться, что для каждого человека может быть только одна основная фотография. В чистом SQL я бы использовал что-то вроде

create unique index on photo (person_id, main) 
where main = true;

Вы можете поиграть с ним здесь http://sqlfiddle.com/#!15/34dfe/4

Как выразить такое ограничение в модели django? Я использую django 4.0.1

Вы можете добавить UniqueConstraint в вашу модель Meta.constraints с условием, чтобы включить это ограничение

class PersonPhoto(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    photo = models.FileField(upload_to='photos/', blank=True, null=True)
    person = models.ForeignKey(
        Person, related_name="photos", on_delete=models.CASCADE
    )
    main = models.BooleanField(default=False)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['person'], condition=models.Q(main=True), name='unique_person_main'),
        ]
Вернуться на верх