在子类类型上过滤 django QuerySet(多 table 继承)?
Filter django QuerySet on subclassed type (multi-table inheritance)?
我正在寻找一种高效的模型管理器方法,该方法使用以下 class 结构来生成 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,所以我正在寻找一种基于子类型的模型管理器方法进行过滤的方法class . 如前所述,我将多表继承与 abstract=False
一起使用,并隐式使用通过此类继承创建的 OneToOneField
。
谢谢!
您可以过滤:
from django.db.models import Q
SuperModel.objects.filter(
<b>Q(subb__isnull=False) | Q(subc__isnull=False)</b>,
date_of_interest=today
)<b>.distinct()</b>
因此,这将在 SubB
和 SubC
模型上生成 LEFT OUTER JOIN
s,并且如果存在与此 JOINing 相关的记录,则 SubB
and/orSubC
不是NULL
,我们知道它是SubB
或SubC
.
类型
我正在寻找一种高效的模型管理器方法,该方法使用以下 class 结构来生成 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,所以我正在寻找一种基于子类型的模型管理器方法进行过滤的方法class . 如前所述,我将多表继承与 abstract=False
一起使用,并隐式使用通过此类继承创建的 OneToOneField
。
谢谢!
您可以过滤:
from django.db.models import Q
SuperModel.objects.filter(
<b>Q(subb__isnull=False) | Q(subc__isnull=False)</b>,
date_of_interest=today
)<b>.distinct()</b>
因此,这将在 SubB
和 SubC
模型上生成 LEFT OUTER JOIN
s,并且如果存在与此 JOINing 相关的记录,则 SubB
and/orSubC
不是NULL
,我们知道它是SubB
或SubC
.