【问题标题】:How to filter objects at django based on related field?如何根据相关字段在 django 过滤对象?
【发布时间】:2019-03-28 04:23:25
【问题描述】:

我有模型:

  • 产品
  • 商店
  • ProductStore(具有StoreProduct 的外键的附加表,布尔值“启用”和库存(整数))

问题:

如何过滤具有Enabled=TrueProducts 以获得当前的store__id(来自请求)? 另外,如何为当前商店有库存的每个对象添加一个附加字段?

更新:

class Product(models.Model): 
   pass 
class Store(models.Model):
   pass
class ProductStoreInfo(models.Model):
   enabled = models.BooleanField(default=True)
   product = models.ForeignKey(Product, related_name='stock_info', on_delete=models.CASCADE)
   store = models.ForeignKey(Store, related_name="stock", on_delete=models.CASCADE)
   stock = models.IntegerField(verbose_name=_('Stock'), blank=True, null=True, default=0, max_length=255)
   price = models.FloatField(verbose_name=_('Price'), blank=True, null=True, max_length=255)

【问题讨论】:

  • 请分享这些机型的相关代码。
  • @willem-van-onsem 更新了,我猜需要使用Q表达式?

标签: django django-database django-request


【解决方案1】:

您可以使用以下方式过滤:

Product.objects.filter(
    stock_info__enabled=True
    stock_info__store_id=my_store_id
)

因此,这将返回一个QuerySet,其中仅包含一个相关 ProductStoreInfo,其中enabledTrue,而store_idstore_id my_store_id(将替换为产生此类 id 的表达式)。

我们还可以用股票数据注释我们的查询集,例如:

from django.db.models import F, Min

Product.objects.filter(
    stock_info__enabled=True
    stock_info__store_id=my_store_id
).annotate(
    stock=Min(F('store_info__stock'))
)

这里来自查询集的Product 对象将有一个额外的属性.stock,其中包含相关ProductStore 对象的stock 列(满足过滤条件)。

【讨论】:

  • AttributeError: 'F' object has no attribute 'lookup' (Django version 1.7.11)
  • @petriichuk:你真的应该升级 Django,自 2015 年 12 月起不再支持 Django-1.7.11(!)djangoproject.com/download 那时 ORM 确实不够“强大”这样做。
  • 已升级,但不过滤...只返回零个对象。澄清一下,每个商店-产品关系都有一行
  • 在注释阶段出错...问题是有很多相关对象...我需要一两个参数(产品,商店)..
  • 你应该得到一个给定的store_id,如果给定的ProductStore有多个stock_infos,那么你在中得到所有这些 Product 对象。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2017-07-02
  • 1970-01-01
  • 2012-08-07
  • 2010-09-20
  • 2019-02-14
  • 2020-07-28
相关资源
最近更新 更多