2012-03-14 51 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