Django 通过一组 table 过滤相关对象获取数据
Django get data by one table with filtered set of related objects
我的目的是从模型 OfferSite
获取基于站点的所有报价,并在今天的日期对 OfferItem
模型进行筛选。
当我 select 在第二个模型上没有过滤器时,我得到了想要的输出(只有 2 个站点 offeritem_set),
In [23]: OfferSite.objects.all().select_related("offeritem")
Out[23]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>]
但是当我尝试在第二个模型上进行过滤时,我得到了很多对象,我认为它是每个 OfferItem 的 returns OfferSite
个对象。我期待只有两个 OfferSite
对象 offeritem_set
来获取所有过滤的 OfferItem
s
``
In [24]: OfferSite.objects.all().select_related("offeritem").filter(offeritem__offer_date=tod)
Out[24]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, '...(remaining elements truncated)...']
是否有 Django ORM 方法来获得所需的输出?
我的模型
class OfferSite(models.Model):
name = models.CharField(max_length=30)
domain_url = models.URLField()
class OfferItem(models.Model):
title = models.CharField(max_length=255)
link = models.CharField(max_length=750)
image = ImageField()
price_after_discount = models.CharField(max_length=100, blank=True, null=True)
price_before_discount = models.CharField(max_length=100, blank=True, null=True)
discount = models.CharField(max_length=100, blank=True, null=True)
offer_date = models.DateField(auto_now_add=True, default=datetime.date.today())
offer_from = models.DateTimeField(blank=True, null=True)
offer_to = models.DateTimeField(blank=True, null=True)
single_item = models.BooleanField(default=True)
site = models.ForeignKey(OfferSite)
archived = models.BooleanField(default=False)
likes = models.IntegerField(max_length=4, default=0)
unlikes = models.IntegerField(max_length=4, default=0)
abusive = models.IntegerField(max_length=3, default=0)
以防其他人正在寻找解决方案。这个问题回答了它 Why does django's prefetch_related() only work with all() and not filter()?。该问题的标题没有反映问题,所以我错过了。
我的解决方案是,
OfferSite.objects.all().prefetch_related(Prefetch("offeritem_set", queryset=OfferItem.objects.filter(offer_date=tod), to_attr="offers"))
This applies only to Django 1.7 & above.
我的目的是从模型 OfferSite
获取基于站点的所有报价,并在今天的日期对 OfferItem
模型进行筛选。
当我 select 在第二个模型上没有过滤器时,我得到了想要的输出(只有 2 个站点 offeritem_set),
In [23]: OfferSite.objects.all().select_related("offeritem")
Out[23]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>]
但是当我尝试在第二个模型上进行过滤时,我得到了很多对象,我认为它是每个 OfferItem 的 returns OfferSite
个对象。我期待只有两个 OfferSite
对象 offeritem_set
来获取所有过滤的 OfferItem
s
``
In [24]: OfferSite.objects.all().select_related("offeritem").filter(offeritem__offer_date=tod)
Out[24]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, <OfferSite: OfferSite object>, '...(remaining elements truncated)...']
是否有 Django ORM 方法来获得所需的输出?
我的模型
class OfferSite(models.Model):
name = models.CharField(max_length=30)
domain_url = models.URLField()
class OfferItem(models.Model):
title = models.CharField(max_length=255)
link = models.CharField(max_length=750)
image = ImageField()
price_after_discount = models.CharField(max_length=100, blank=True, null=True)
price_before_discount = models.CharField(max_length=100, blank=True, null=True)
discount = models.CharField(max_length=100, blank=True, null=True)
offer_date = models.DateField(auto_now_add=True, default=datetime.date.today())
offer_from = models.DateTimeField(blank=True, null=True)
offer_to = models.DateTimeField(blank=True, null=True)
single_item = models.BooleanField(default=True)
site = models.ForeignKey(OfferSite)
archived = models.BooleanField(default=False)
likes = models.IntegerField(max_length=4, default=0)
unlikes = models.IntegerField(max_length=4, default=0)
abusive = models.IntegerField(max_length=3, default=0)
以防其他人正在寻找解决方案。这个问题回答了它 Why does django's prefetch_related() only work with all() and not filter()?。该问题的标题没有反映问题,所以我错过了。
我的解决方案是,
OfferSite.objects.all().prefetch_related(Prefetch("offeritem_set", queryset=OfferItem.objects.filter(offer_date=tod), to_attr="offers"))
This applies only to Django 1.7 & above.