【问题标题】:How to choose one item in many to many relationship as special?如何在多对多关系中选择一项作为特殊项?
【发布时间】:2022-01-02 11:37:48
【问题描述】:

从 m2m 关系中选择一项的最佳做法是什么? 假设我有一个相册:

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

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

但现在我也想选一张照片作为封面。我可以将相册中的外键用于一张照片,但我总是需要检查这张照片是否真的在该相册的照片中。有没有更好的办法?

对不起,我只是在某种程度上找不到合适的词来谷歌搜索它。

谢谢, 迈克尔

【问题讨论】:

    标签: django django-models django-database


    【解决方案1】:

    您可以使用布尔值cover 自定义through=… model [Django-doc],如果它是封面项目,则设置为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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 2014-08-28
      • 2012-09-11
      • 2021-08-13
      • 2013-05-14
      • 1970-01-01
      • 2017-05-14
      • 2016-07-20
      相关资源
      最近更新 更多