2012-03-14 53 views
0

鉴于以下车型Django的模型查询恢复参照过滤混乱

class Category(models.Model): 
    name = models.CharField(max_length=50) 

class Business(models.Model): 
    name = models.CharField(max_length=50) 
    category = models.ForeignKey(Category, related_name="businesses") 

class Package(models.Model): 
    business_id = models.ForeignKey(Business) 
    status = models.CharField(max_length=50) 

我有2个以下查询获得的业务,哪些包是活的类别列表:

filter_businesses = Business.objects.filter(package__status = 'live') 
filter_categories = Category.objects.filter(businesses__package__status = 'live') 

现在的问题是,鉴于相关名称“企业”应该等于category.business_set,为什么不应该在第一个查询中的过滤器是package_set?

回答

1

假设您有两个相关型号:SomeModelSomeOtherModel,以及SomeOtherModel.somemodel是一个到SomeModel的外键。

鉴于任何SomeModel实例,someothermodel_set属性是已经过滤的相关模型的管理器。例如:

>>> your_some_model_instance = SomeModel.objects.all()[0] 

在这种情况下your_some_model_instance.shomeothermodel_set相当于:

>>> SomeOtherModel.objects.filter(somemodel=your_some_model_instance) 

[更新]

对不起也许我没有解释我的问题更清晰,它是复杂的解释...我知道XX_set和related_name指的是管理员,我想问的是在第一个查询中为什么不使用(package_set_ status ='live')给出第二个工作查询(企业 _package__status =“现场”),这是令人困惑,因为向经理(由related_name),但第一个查询第二个查询引用不...

过滤器接口使用惯例relatedmodelname__relatedmodelfield;在你的例子中,related_name被用来给反向引用一个更加奇特的名字,但这不是它的主要目的; ForeignKey字段中related_name参数的用途解决了在relatedModelname与ForeignKey中已有字段冲突的情况下的不明确性。

+0

关闭。你的意思是'..._set.all()'在最后一个。 – 2012-03-14 04:33:17

+0

@ IgnacioVazquez-Abrams:你是对的,'..._set'是一个管理器(比如'SomeModel.objects'),而不是查询集 - 为简单起见省略了细节。 – 2012-03-14 04:53:02

+0

对不起,也许我没有更清楚地解释我的问题,解释起来很复杂......我知道XX_set和related_name是指经理,我想问的是在第一个查询中为什么不使用(package_set__status ='live' )给出第二个工作查询(business__package__status ='live'),这很令人困惑,因为第二个查询引用了manager(由related_name),但第一个查询不是...... – 2012-03-14 08:03:12