【问题标题】:Django get data by one table with filtered set of related objectsDjango通过一个表获取数据,并过滤一组相关对象
【发布时间】:2015-10-15 21:15:17
【问题描述】:

我的意图是从OfferSite 模型中获取基于站点的所有优惠,并在OfferItem 模型上筛选今天的日期。

当我在第二个模型上选择所有没有过滤器时,我得到了想要的输出(只有 2 个带有 offeritem_set 的站点),

In [23]: OfferSite.objects.all().select_related("offeritem")
Out[23]: [<OfferSite: OfferSite object>, <OfferSite: OfferSite object>]

但是当我尝试过滤第二个模型时,我得到了很多对象,我认为它会为每个 OfferItem 返回OfferSite 对象。我期望只有两个 OfferSite 对象和 offeritem_set 来获取所有过滤的 OfferItems

``
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)

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    以防万一其他人正在寻找解决方案。这个问题回答了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"))
    

    这仅适用于 Django 1.7 及更高版本。

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2021-10-30
      • 2019-05-05
      • 2015-03-24
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      相关资源
      最近更新 更多