2010-11-22 134 views
0

,我有以下的Django模型 -Django模型外鍵字段匹配

class M(models.Model): 
    ... 
    disp_name = models.CharField(max_length=256, db_index=True) 
    ... 

class XX(models.Model): 
    x = models.ForeignKey(User) 
    y = models.ForeignKey(M, unique=True) 

現在在我的views.py,我想要做的所有項目的部分字符串匹配在XX與現場y.disp_name。

通常人會做到這一點 - M.objects.filter(disp_name__istartswith='string')

但這裏MModel XX一個ForeignKey。所以如果我做XX.objects.filter(y.disp_name__istartswith='string')我得到一個錯誤。

此外,這也失敗了 - u = User.objects.get(id=1) u.xx_set.filter(y.disp_name__istartswith='string')

例外,我得到說的是 - SyntaxError: keyword can't be an expression (<console>, line 1)

如何做到這一點?

回答

2

我希望你使用了適當的字段名稱而不是X,Y和M--它很難遵循。

但在任何情況下,你應該總是使用雙下劃線的語法遵循在過濾器表達式的左側關係:

XX.objects.filter(y__disp_name__istartswith='string') 

(技術原因是該參數filter實際上是函數的關鍵字參數,所以左側必須是字符串而不是表達式。)

+0

對不起,公司規則。謝謝,這解決了問題!所以Django在'__'上拆分LHS部分並將其用作字段? – 2010-11-22 10:50:36

+1

是的,雖然很自然,但由於需要將查詢類型('in','istartswith'等)與連接區分開來,所以它更復雜。如果您有興趣,請參閱'django.db.models.sql.query.Query.add_filter'中的代碼。 – 2010-11-22 11:41:31