来自不同模型的Concat QuerySet

时间:2019-03-01 13:36:08

标签: python django

我的模特:

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字段执行过滤?

1 个答案:

答案 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