2010-03-27 155 views
10

在以下模型:Django的外鍵查詢

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

如果在數據庫中的表頭行作爲 Id=1, title=value-mart , createdby=CEO

如何查詢條件和選項表,以獲取所有的值有關頭表 id = 1

也可以有人請建議一個很好的鏈接查詢的例子。

回答

9

首先,不要在名稱中使用id,因爲它很混亂。該字段不是ID,它是對象本身。 (如果你有一個字段ref它會自動產生一個電場ref_id

options.objects.filter(header=a_header) 

你查詢它像任何值,其中一些頭實例是您要過濾的值。

3

我會建議嘗試給我們一個coding style和命名約定,更像是你在Django文檔中看到的Models。更多的東西是這樣的:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

,然後查詢他們需要:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

many-to-one relationships該文檔還引用了usage example

20

Ironfroggy是對的,但有另一種更明顯的方式來獲得相關的optionscriteria對象。 Django自動爲指向模型的每個外鍵創建一個「反向關係」,這通常是相關模型的名稱加上_set。所以:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

會給你所有與criteria對象mycriteriaoptionsheader對象。

而且,在風格注:爲ironfroggy指出的那樣,你不應該使用外鍵的字段id,而且你應該使用大寫的風格爲您的模型類,所以你可以看到該類Criteria之間的差異和特定實例criteria

在鏈接方面,Django documentation非常好,並解釋了所有這一切。

5

聽起來像你正在尋找Following relationships "backward"

你可以得到你想要的,以濾除頭對象,並使用類似

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

看那documentation獲取更詳細的信息