【问题标题】:Filter django QuerySet on subclassed type (multi-table inheritance)?在子类类型(多表继承)上过滤 django QuerySet?
【发布时间】:2021-06-12 18:30:41
【问题描述】:

我正在寻找一种高效的模型管理器方法,它使用以下类结构来生成 QuerySet,如下所述:

#models.py
from django.db import models

class SuperModel(models.Model):
    date_of_interest = models.DateField(...)
    # <other model_fields>

class SubA(SuperModel):
    # <other model_fields>

class SubB(SuperModel):
    # <other model_fields>

class SubC(SuperModel):
    # <other model_fields>

#somewhere else (eg. views.py)
...    
query_set = SuperModel.objects.filter(date_of_interest=today)
qs_to_list = [e for e in query_set if hasattr(e, 'subb') or hasattr(e, 'subc')]

我想将 qs_to_list 保留为 QuerySet,因此我正在寻找一种方法来根据子类的类型使用模型管理器方法进行过滤。如上所述,我是将多表继承与abstract=False 一起使用,并隐式使用使用这种继承类型创建的OneToOneField

谢谢!

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    您可以使用以下方式过滤:

    from django.db.models import Q
    
    SuperModel.objects.filter(
        Q(subb__isnull=False) | Q(subc__isnull=False),
        date_of_interest=today
    ).distinct()

    这将因此在SubBSubC 模型上生成LEFT OUTER JOINs,并且如果此JOINing 存在SubB 和/或SubC 不是NULL 的记录,我们知道它的类型是SubBSubC

    【讨论】:

    • 非常适合我的目的。谢谢。
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多