我有一个非常简单的模型:一个Clip可以有多个AdBase,一个AdBase可以有多个Clip。
class AdBase(models.Model):
title = models.CharField(max_length=200, default=None, null=True,
blank=False)
class Clip(models.Model):
ads = models.ManyToManyField(AdBase, related_name='clips',
through='ClipAd')
class ClipAd(models.Model):
clip = models.ForeignKey(Clip, on_delete=models.CASCADE,
blank=False, null=False)
ad = models.ForeignKey(AdBase, on_delete=models.CASCADE,
blank=False, null=False)
position = models.IntegerField(default=0, blank=False, null=False)我希望在Clip类中有一个查询,它返回按position排序的所有剪辑。
我想出了这个:
class Clip(models.Model):
ads = models.ManyToManyField(AdBase, related_name='clips',
through='ClipAd')
def ads_by_position(self):
# there might be a simpler query than this:
return [a.ad
for a in ClipAd.objects.filter(clip=self).order_by('position')]但是我确信使用我的类Clip的ads属性有一个更简单的语法,但是我没有找到。
你有什么想法(或者这是唯一的解决方案)?
发布于 2020-05-24 18:30:59
您可以使用prefetch_related来实现此目的。这也会大大减少你的数据库负载。此外,使用自定义managers值得一看。
class ClipManager(models.Manager):
def get_with_adds():
return Clip.objects.filter().prefetch_related("ads")
class AdBase(models.Model):
title = models.CharField(max_length=200, default="")
class Clip(models.Model):
ads = models.ManyToManyField(AdBase, related_name='clips',
through='ClipAd')
objects = ClipManager()
class ClipAd(models.Model):
clip = models.ForeignKey(Clip, on_delete=models.CASCADE)
ad = models.ForeignKey(AdBase, on_delete=models.CASCADE)
position = models.IntegerField(default=0)
clips_with_adds = Clip.objects.get_with_adds()发布于 2020-05-24 17:49:34
您可以直接访问相关的多对多项目:
def ads_by_position(self):
return self.ads.all().order_by('position')https://stackoverflow.com/questions/61983961
复制相似问题