2016-08-01 46 views
1

我想创建一个模型,经理对我的购买模式:Django的查询集 - 在相关对象的布尔值筛选对象

class Purchase(models.Model) 
    number = models.IntegerField 

class InventoryLog(models.Model) 
    purchase = models.ForeignKey(Purchase) 
    sold_out = models.BooleanField(default=false) 

我想我的模型管理器返回任何Purchase对象不相关到InventoryLog对象与值True

有没有办法处理这与查询集,Q对象或F对象,或者我需要诉诸for循环?

回答

2

我相信Purchase.objects().exclude(inventorylog__sold_out=True)会这样做。

+0

很棒!谢谢! –

0

如果你想使用管理的模型,这个怎么样:更新感谢Peter DeGlopper评论

#models.py 
class PurhchaseNotSoldOut(models.Manager): 
    def get_queryset(self): 
     return super(PurchaseNotSoldOut, self).get_queryset()\ 
          .exclude(purhcase_logs__sold_out=True) 

class Purchase(models.Model) 
    number = models.IntegerField 

    notSoldOut = PurchaseNotSoldOut() 

class InventoryLog(models.Model) 
    purchase = models.ForeignKey(Purchase, related_name='purchase_logs') 
    sold_out = models.BooleanField(default=false) 

代码示例

+1

1)您的'filter'子句中的语法不正确,请使用'__'来跟踪过滤器中的fk关系。 2)这两个查询不等价,因为'Purchase'可以有许多'InventoryLog'。 'filter(purchase_log__sold_out = False)'发现至少有一个没有售罄,'exclude()'排除那些售罄的人(所以它只返回那些没有售罄的人)。 –

+0

覆盖'get_queryset'有什么好处,而不是仅仅返回一个新的? –

+0

覆盖'get_queryset'就是您通常如何制作自定义管理器:https://docs.djangoproject.com/en/1.9/topics/db/managers/#modifying-a-manager-s-initial-queryset –