首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django查询else/ else?

Django查询else/ else?
EN

Stack Overflow用户
提问于 2022-08-22 13:31:24
回答 1查看 63关注 0票数 1

我正在建一个展示相册的网站。为此,我有以下模型。

代码语言:javascript
复制
class Medium(models.Model):
    pass

class MediaSet(models.Model):
    media = models.ManyToManyField("Medium", related_name="sets", through="SetContent", through_fields=('set', 'medium'),)

class SetContent(models.Model):
    is_cover = models.BooleanField(default=None, null=True)
    set = models.ForeignKey("MediaSet", on_delete=models.CASCADE, related_name="set_content")
    medium = models.ForeignKey("Medium", on_delete=models.CASCADE, related_name="set_contents")

每个MediaSet(=相册)都可能有封面。如果没有的话,我只会使用第一张图片。

现在,我试图通过减少查询来优化DB。我正在编写MediaSetListView,其中列出了MediaSets。根据是否存在is_cover,是否可以在查询级别对一个覆盖(一种介质)进行注释或预取()?

换句话说:获取所有媒体的列表,并让每个mediaset都有一个封面,即在SetContent中标记为“SetContent”的媒体,或者是SetContent中的第一个媒体。

目前,我在模型中有这个逻辑,但这会导致大量的查询,而我不想要这些查询。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2022-08-22 13:53:36

如何将封面引用添加到MediaSet类并使用属性装饰器?这将为您节省多个表中的额外列,而且我假设每个专辑的封面永远不会超过一个,对吗?在我看来,这种关系应该反映在MediaSet类中。顺便说一下,您最终也可以省去SetContent类了。

代码语言:javascript
复制
class MediaSet(models.Model):
    _cover = models.ForeignKey("Medium", blank=true, null=true, on_delete=models.SET_NULL)
    media = models.ManyToManyField("Medium", related_name="albums")
    
    @property
    def cover(self):
        if self._cover:
            return self._cover
        else:
            return self.media.first()  

    @cover.setter
    def cover(self, value):
        self._cover = value
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73445971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档