utils.models.query module¶
查询引用字段
获取查询字段的函数,且同时支持字段描述符、字段实例以及字段名称。
通过标记字段为特殊关联字段,可以获取特殊关联字段的查询名称。
进行单条件查询的函数,使用首个字段所在模型的默认管理器进行查询。
辅助多条件查询的函数,追踪关系并查询字段。
在本模块中,有 s 前缀的函数均为单字段转化函数或单条件查询函数,m 前缀的为多条件查询函数。
在以往的代码中,我们经常会看到这样的代码:
class AModel(Model):
fkey_name = models.ForeignKey(...)
class BModel(Model):
fkey2_name = models.ForeignKey(A_Model)
当跨越关系查询时,我们需要写很长的代码,这样不仅不美观,而且不利于代码的追踪修改,例如:
instance = BModel.objects.filter(fkey2_name__fkey_name__field_name=...)
values = BModel.objects.values('fkey2_name__fkey_name__field_name')
如需修改`fkey2_name`字段的名称,则无法追踪以上代码,因此修改起来非常困难,且容易出错。 这是因为我们使用字符串来引用字段来引用字段。如果我们通过字段本身来引用,就可以避免这个问题。
示例
使用`f`和`q`类型函数来获取字段的查询名称和条件,并追踪引用:
instance = BModel.objects.filter(sq([BModel.fkey2_name, AModel.fkey_name, 'field_name'], ...))
values = BModel.objects.values(f(BModel.fkey2_name, AModel.fkey_name, 'field_name'))
对于**名称固定**的最终非关系字段,使用关键字参数查询往往更方便:
instance = queryset.get(mq(BModel.fkey2_name, AModel.fkey_name, field_name=...))
在默认管理器上进行查询时,可以直接使用查询函数:
instance = mget(BModel.fkey2_name, AModel.fkey_name, field_name=...)
names = svlist(BModel.fkey2_name, AModel.fkey_name, field_name)
blogs = mfilter(Blog.author, Author.user, score=0, active=True)
警告
从非抽象父类继承的字段仍存储于父类中,作为查询函数首个参数时,会使用父类的默认管理器进行查询。 本模块的函数在模型定义时无法使用,因为字段描述符在模型类创建后才会被创建,但你可以在任何方法中使用。
备注
本模块不提供与更新相关的函数,因为更新不会跨越关系,且应以管理器要求的安全方式进行。 尽管多条件查询支持关键字参数,你仍应避免在条件中包含`__`以阻碍`field=`型字段追踪。 抽象模型的字段在子类被继承时被复制,因此可以在子类中使用本模块的函数。
- class utils.models.query.Forward(fieldlike: RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor)[源代码]¶
基类:
SpecialRelation
正向关系字段
标记字段为正向关系字段,查询时转化为`%field_name%`。
- class utils.models.query.Index(fieldlike: RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor)[源代码]¶
基类:
SpecialRelation
索引字段
标记字段为索引字段,查询时转化为`%field_name%_id`。
- class utils.models.query.Reverse(fieldlike: RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor)[源代码]¶
基类:
SpecialRelation
反向关系字段
标记字段为反向关系字段,查询时转化为`%related_query_name%`。
- utils.models.query.f(*fields: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str) str [源代码]¶
获取连续字段的查询名称
- utils.models.query.mexclude(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, **querys: Any) QuerySet [源代码]¶
多条件排除查询集,见`QuerySet.exclude`,查询条件为交集
- utils.models.query.mfilter(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, **querys: Any) QuerySet [源代码]¶
多条件过滤查询集,见`QuerySet.filter`
- utils.models.query.mget(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, **querys: Any) Any [源代码]¶
多条件获取模型实例,见`QuerySet.get`
- utils.models.query.mq(*fields: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, **querys: Any) Q [源代码]¶
获取包含某字段多个查询条件的Q对象
- 参数:
*fields -- 代表字段的完整路径,可以包含连续字段
**querys -- 查询条件,键为查询类型(见Note部分),值为查询值
- 返回:
将每个查询条件`key: value`转为`q(*fields, key, value=value)`的`Q`条件之交
- 返回类型:
Q
示例
>>> mq('user', 'id', lt=1, gt=0, isnull=False) Q(user__id__lt=1, user__id__gt=0, user__id__isnull=False) >>> mq('user', 'id', IN=[1, 2, 3]) Q(user__id__in=[1, 2, 3])
备注
尽量避免在查询条件中包含`__`,这严重妨碍了`field=`型字段追踪。 Python 的关键字`in`无法作为关键字参数传递,可以使用其任何大小写形式代替。
- utils.models.query.q(*fields: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, value: Any) Q [源代码]¶
获取连续字段的查询Q对象
- utils.models.query.qsvlist(queryset: QuerySet, field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str) list[Any] [源代码]¶
单条件查询字段值,立即计算并转为列表,见`QuerySet.values_list`
- utils.models.query.sexclude(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | list[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation] | tuple[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, ...], value: Any) QuerySet [源代码]¶
单条件排除查询集,见`QuerySet.exclude`
- utils.models.query.sfilter(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | list[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation] | tuple[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, ...], value: Any) QuerySet [源代码]¶
单条件过滤查询集,见`QuerySet.filter`
- utils.models.query.sget(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | list[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation] | tuple[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, ...], value: Any) Any [源代码]¶
单条件获取模型实例,见`QuerySet.get`
- utils.models.query.sq(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str | list[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str] | tuple[Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str, ...], value: Any) Q [源代码]¶
获取单个查询条件的Q对象,可以包含连续字段
- utils.models.query.svalues(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str)[源代码]¶
单条件查询字段值,见`QuerySet.values`
- utils.models.query.svlist(field: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation, *extras: Field | DeferredAttribute | FileDescriptor | RelatedField | ForwardManyToOneDescriptor | ForwardOneToOneDescriptor | ReverseManyToOneDescriptor | ReverseOneToOneDescriptor | ForeignKeyDeferredAttribute | ManyToManyDescriptor | SpecialRelation | str) list[Any] [源代码]¶
单条件查询字段值,立即计算并转为列表,见`QuerySet.values_list`