2010-11-22 114 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