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`