代码之家  ›  专栏  ›  技术社区  ›  JasonTS

如何在多对多关系中选择一个项目作为特殊项目?

  •  0
  • JasonTS  · 技术社区  · 4 年前

    从m2m关系中选择一个项目的最佳实践是什么? 假设我有一本照片集:

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

    但现在我也想选一张照片作为封面。我可以在相册中使用外键来编辑一张照片,但之后我总是需要检查这张照片是否真的存在于相册的照片中。有更好的办法吗?

    抱歉问了一个基本问题,我就是找不到合适的词来搜索它。

    谢谢 迈克尔

    0 回复  |  直到 4 年前
        1
  •  1
  •   willeM_ Van Onsem    4 年前

    你可以定制 through=… model [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 ,而第二个条件保证 专辑 最多有一个 照片 为什么 cover=True .