我的模特:
class BaseModel(models.Model):
my_field = models.CharField(max_length=250)
class Meta:
abstract = True
class ModelA(BaseModel):
a_field = models.CharField(max_length=250)
class ModelB(BaseModel):
def some_function(self):
return 'some result'
现在,我想对queryset执行过滤,其中queryset由ModelA.objects.all()和ModelB.objects.all()组成。
我尝试过:
queryset = chain(ModelA.objects.all(), ModelB.objects.all())
然后:
queryset.filter(my_field='some_string')
但是我收到以下错误:
'itertools.chain' object has no attribute 'filter'
如何将这两个模型的QuerySet合并为一个,并仅基于BaseModel字段执行过滤?
答案 0 :(得分:3)
要完成此操作,您将需要使用Multi-Table Inheritance并查询BaseModel而不是Abstract Base Class
BaseModel.objects.filter(my_field='some_string')
#returns a queryset of BaseModels
或者有一个名为Django Polymorphic的第三方程序包,使用上述代码将返回子类模型而不是超类模型。这似乎使您最接近所需的解决方案。这是一个非常酷的程序包!
BaseModel.objects.filter(my_field='some_string')
#returns a queryset of ModelAs and ModelBs