我正在开发一个需要对指定模型字段执行操作的 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 的无数胆量有着难以辨认的耦合。
我有理由确定查询过滤器语法可以比我想象的更简单地完成。我应该从哪里开始?
提前致谢。