python - Django 通过一个表获取数据并过滤一组相关对象

标签 python django django-orm

我的目的是从模型 OfferSite 中获取基于网站的所有报价,并在今天的日期对 OfferItem 模型进行筛选。

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

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

但是当我尝试在第二个模型上进行过滤时,我得到了很多对象,我认为它会为每个 OfferItem 返回 OfferSite 对象。我原以为只有两个带有 offeritem_setOfferSite 对象来获取所有过滤的 OfferItem

``
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()? .该问题的标题没有反射(reflect)问题,所以我错过了。

我的解决方案是,

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.

关于python - Django 通过一个表获取数据并过滤一组相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623394/

相关文章:

python - 监听 pyqtBoundSignal 上的新信号连接

python - 带有 X-Sendfile 的 Flask 开发服务器

python - Django 模型表单设置 POST 但不保存

django - 如何为 DRF Serializer 访问/创建正确的 Request 对象?

python - 在 3D 中拟合线

python - pandas:加载 csv 时跳过字符串

django - 测试 Django 管理操作(重定向/身份验证问题)

django - Django跨越关系

python - Django对相关一对多对象的聚合查询

python - 查找相关对象并显示关系