3

我正在开发一个需要对指定模型字段执行操作的 Django 应用程序。

Django 已经有一种调用样式来引用具有查询约束的模型字段——多个术语被组合成带有双下划线的谓词并作为关键字参数传递。查询集过滤,使用QuerySet.filter()and Q(),使用这种语法,例如:

stuff = MyStuff.objects.filter(name__isnull=False)
thing = MyStuff.objects.filter(Q(name__icontains="yo") & Q(ptype__iendswith="dogg")).get()

表达式使用相同的语法F(),用于在查询语句中构建动态谓词。大多数 Django 用户已经以某种形式看到(如果没有使用)这种语法。

我想创建一个类似的动态评估的、可组合的 Python 习惯用法——为了这个问题,我称之为它G()——它使用相同的语法,为延迟评估的字段查找实例提供类似的句柄,可以在逻辑上与其他此类实例重新组合。

应该如何处理这项任务?两者Q()F()都是子类django.utils.tree.Node——至少它们在 Django 1.4 中(它们并不总是像现在这样实现,它们的接口可能是私有的,也可能不是私有的)。我相信,大部分 kwarg-filter-expression 动作都发生在django.db.models.sql.Query...... 这是一个巨大而令人生畏的类,与 ORM 的无数胆量有着难以辨认的耦合。

我有理由确定查询过滤器语法可以比我想象的更简单地完成。我应该从哪里开始?

提前致谢。

4

1 回答 1

2

我不确定您要使用双下划线关键字做什么,但最简单的起点可能是这里:

>>> def G(**kwargs):
...     for key, value in kwargs.items():
...         print "{} = {}".format(key.split("__"), value)
...         
...     
... 
>>> G(some__key__here="val1", another__one__again="val2")
['some', 'key', 'here'] = val1
['another', 'one', 'again'] = val2

从那里开始,我想这取决于您将如何处理这些信息。希望这可以帮助!

于 2013-01-16T00:58:27.103 回答