Как выбрать один элемент в отношениях "многие ко многим" как особенный?

Как лучше всего выбрать один элемент из отношений m2m? Допустим, у меня есть альбом с фотографиями:

class Photo(models.Model):
  img = models.FileField()

class Album(models.Model):
  photos = models.ManyToManyField("Photo")

Но теперь я также хочу выбрать одну фотографию в качестве обложки. Я мог бы использовать внешний ключ в альбоме для одной фотографии, но тогда мне нужно будет постоянно проверять, действительно ли эта фотография находится среди фотографий этого альбома. Есть ли лучший способ?

Простите за основной вопрос, просто как-то не могу найти нужные слова, чтобы погуглить.

Спасибо, Майкл

Вы можете сделать пользовательскую through=… модель [Django-doc] с булевым значением cover, которое устанавливается в True в случае, если это элемент обложки:

from django.db.models import Q, UniqueConstraint

class Photo(models.Model):
  img = models.FileField()

class Album(models.Model):
  photos = models.ManyToManyField(Photo, through='AlbumPhoto')

class AlbumPhoto(models.Model):
    photo = models.ForeignKey(Photo, on_delete=models.CASCADE)
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    cover = models.BooleanField(default=False)
    
    class Meta:
        constraints = [
            UniqueConstraint(fields=['photo', 'album'], name='no_photo_multiple_times'),
            UniqueConstraint(fields=['album'], condition=Q(cover=True), name='one_cover_per_album'),
        ]

Первое ограничение гарантирует, что вы не можете добавить один и тот же Photo несколько раз к одному и тому же Album, тогда как второе условие гарантирует, что каждый Album имеет не более одного Photo, для которого cover=True.

Вернуться на верх