2010-05-04 78 views
1

想象一下,你有這樣的模式:外鍵問題

class Category(models.Model): 
     node_id = models.IntegerField(primary_key = True) 
     type_id = models.IntegerField(max_length = 20) 
     parent_id = models.IntegerField(max_length = 20) 
     sort_order = models.IntegerField(max_length = 20) 
     name = models.CharField(max_length = 45) 
     lft = models.IntegerField(max_length = 20) 
     rgt = models.IntegerField(max_length = 20) 
     depth = models.IntegerField(max_length = 20) 
     added_on = models.DateTimeField(auto_now = True) 
     updated_on = models.DateTimeField(auto_now = True) 
     status = models.IntegerField(max_length = 20) 
     node = models.ForeignKey(Category_info, verbose_name = 'Category_info', to_field = 'node_id' 

最重要的部分是外鍵。 當我嘗試:

Category.objects.filter(type_id = 15, parent_id = offset, status = 1) 

我得到得到一回到範疇,它是罰款,因爲它應該返回多個錯誤。但我想過濾結果谷底另一個領域,這將是類型ID(從第二模型)

這就是:

class Category_info(models.Model): 
     objtree_label_id = models.AutoField(primary_key = True) 
     node_id = models.IntegerField(unique = True) 
     language_id = models.IntegerField() 
     label = models.CharField(max_length = 255) 
     type_id = models.IntegerField() 

的TYPE_ID可以是1任意數量 - 5.我desparately試圖讓只有一個結果,其中TYPE_ID將數字1

這是我想在SQL:

SELECT c.*, ci.* 
FROM category c 
JOIN category_info ci ON (c.node_id = ci.node_id) 
WHERE c.type_id = 15 AND c.parent_id = 50 AND ci.type_id = 1 

任何幫助是極大的讚賞。

問候

+0

您的代碼格式化borked(你需要4個空格縮進所有行,而不僅僅是第一個) – 2010-05-04 15:28:48

+0

它現在應該是固定的。 – realshadow 2010-05-04 15:29:28

回答

0

好吧所以...

select_related()用下劃線啄起來效果很好...

+0

請注意,'select_related'不是*必需的*,但這裏其實是一個好主意! :) – 2010-05-05 13:16:57

4

要上的字段篩選相關表中,使用雙下劃線符號。要獲得所有Category的物件,相關Category_info對象的type_id爲15,使用:然後

Category.objects.filter(node__type_id=15) 

Django會自動地知道您指的是type_id領域的任何表node有關。

+0

感謝您的快速回答。 所以它看起來是這樣的: Category.objects.filter(TYPE_ID = 15,PARENT_ID =偏移,狀態= 1,node__type_id = 1) 因爲不知何故不工作,或者......我只是工作太多了: s 編輯:我已經改變了一點點的SQL,所以它會更好理解。 – realshadow 2010-05-04 15:41:52

+0

散步外站總是會幫助我的心:) 非常感謝 – realshadow 2010-05-04 18:46:00

0

所以它仍然沒有解決我的問題。讓我試着解釋一點。

可以說的是,SQL:

SELECT c.*, ci.* 
FROM category c 
JOIN category_info ci ON (c.node_id = ci.node_id) 
WHERE c.type_id = 15 AND c.parent_id = 50 

將返回兩行。兩者是相同的,除了category_info表中的type_id字段,其中有兩種類型 - 1和2.如果我將添加到sql-ci.type_id = 1,我會得到正確的結果。但是根據我所嘗試的,即使使用doubleunderscore符號,它仍然在Django中返回2行。

現在我已經得到了:

Category.objects.filter(type_id = 15, parent_id = offset, status = 1, node__type_id = 1) 

凡node__type_id = 1表示 「ci.type_id = 1」。但它仍然會返回兩行。當我從模型定義中刪除「to_field」時,它會通過,但返回錯誤的數據,因爲它默認將它綁定到主鍵。我試圖通過鏈接另一個過濾器來過濾數據,但仍然無法通過它。

下面是一個比特形式的調試,也許它可以幫助:

Caught an exception while rendering: get() returned more than one Category_info -- it returned 2! Lookup parameters were {'node_id__exact': 5379L} 

它仍然看起來像它試圖尋找只爲NODE_ID而不是爲TYPE_ID。

嘆息,我可以哭...

+0

這看起來像從另一個查詢異常。 Category_info對象的.get()查詢。 一個.filter()不會給你這個例外 – 2010-05-04 22:01:33