如何根据相关字段在Django过滤对象?

时间:2018-10-23 20:28:22

标签: django django-database django-request

我有以下型号:

  • 产品
  • 商店
  • ProductStore(具有StoreProduct外键的附加表,还具有布尔值“ enabled”和stock(integer))

问题:

如何为当前Product过滤Enabled=True个具有store__id的{​​{1}}(来自请求)? 另外,如何为当前商店中有库存的每个对象添加一个附加字段?

已更新:

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)

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法对此进行过滤:

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

因此,这将返回一个QuerySet,其中仅包含与{em>相关的 Product,其中ProductStoreInfo为{{ 1}},而enabledTrue(将替换为产生这种ID的表达式)。

我们还可以使用库存数据注释查询集,例如:

store_id

在这里,来自查询集的my_store_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列(满足过滤条件)。< / p>