我正在建一个展示相册的网站。为此,我有以下模型。
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中的第一个媒体。
目前,我在模型中有这个逻辑,但这会导致大量的查询,而我不想要这些查询。
谢谢你的帮助。
发布于 2022-08-22 13:53:36
如何将封面引用添加到MediaSet类并使用属性装饰器?这将为您节省多个表中的额外列,而且我假设每个专辑的封面永远不会超过一个,对吗?在我看来,这种关系应该反映在MediaSet类中。顺便说一下,您最终也可以省去SetContent类了。
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 = valuehttps://stackoverflow.com/questions/73445971
复制相似问题