Как выбрать один элемент в отношениях "многие ко многим" как особенный?
Как лучше всего выбрать один элемент из отношений 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
.