【问题标题】:Django Models Foreign Key Field MatchDjango 模型外键字段匹配
【发布时间】:2010-11-22 10:41:26
【问题描述】:

我有以下 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')

但这里M 是Model XX 中的外键。所以如果我这样做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)

如何做到这一点?

【问题讨论】:

    标签: python django django-models string-matching


    【解决方案1】:

    我希望你使用正确的字段名称而不是 X、Y 和 M - 这真的很难理解。

    但无论如何,您应该始终使用双下划线语法来遵循过滤表达式左侧的关系:

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

    (这样做的技术原因是filter 的参数实际上是函数的关键字参数,所以它的左侧必须是字符串而不是表达式。)

    【讨论】:

    • 对不起,公司规定。谢谢,这解决了问题!所以 django 将 LHS 部分拆分为 '__' 并将其用作字段?
    • 是的,差不多,尽管它自然比这更复杂,因为需要将连接与查找类型(in、istartswith 等)区分开来。如果您有兴趣,请参阅django.db.models.sql.query.Query.add_filter 中的代码。
    猜你喜欢
    • 2021-12-19
    • 2020-06-30
    • 2021-09-13
    • 2015-10-14
    • 2011-11-28
    • 2014-01-03
    • 2020-05-14
    • 2016-04-24
    • 2015-06-13
    相关资源
    最近更新 更多