如何实现Django queryfilter表达式API的kwarg语法(例如“related_model_ufieldname_ucondition`)?

2024-06-07 18:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Django已经有了一种用于引用带有查询约束的模型字段的调用样式——多个术语被组合成带有双下划线的谓词,并作为关键字arg传递。查询集过滤,使用QuerySet.filter()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()和{}都是django.utils.tree.Node的子类——至少它们在django1.4中(它们并不是总是像现在这样实现的,它们的接口可能是私有的,也可能不是私有的)。kwarg过滤器表达式的大部分动作发生在django.db.models.sql.Query中,我相信。。。这是一个庞大而令人望而生畏的类,与ORM的无数部分有着难以辨认的耦合。在

我确信查询过滤器语法可以比我想象的简单得多。我应该从哪里开始?在

提前谢谢。在


Tags: django实例name模型应用程序过滤器objects表达式
1条回答
网友
1楼 · 发布于 2024-06-07 18:35:28

我不太清楚你想用双下划线的关键字做什么,但最简单的起点可能是这里:

>>> 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

从那以后,我想这取决于你将如何处理这些信息。希望这有帮助!在

相关问题 更多 >

    热门问题