如何在Django queryset中创建联合

如何在Django queryset中创建联合,django,django-rest-framework,Django,Django Rest Framework,我在项目中使用Django REST框架,我想创建两个不同的模型 我的车型 class A(models.Model): name = models.CharField(max_length=240, blank=True) geometry = models.GeometryField(blank=True, null=True) abwrapper= models.ForeignKey(ABWrapper) class Meta: db_ta

我在项目中使用Django REST框架,我想创建两个不同的模型

我的车型

class A(models.Model):
    name = models.CharField(max_length=240, blank=True)
    geometry = models.GeometryField(blank=True, null=True)
    abwrapper= models.ForeignKey(ABWrapper)

    class Meta:
        db_table = 'tbl_a'

class B(models.Model):
    name = models.CharField(max_length=240, blank=True)
    link = models.IntegerField(blank=True, null=True)
    geometry = models.GeometryField(blank=True, null=True)
    abwrapper= models.ForeignKey(ABWrapper)

    class Meta:
        db_table = 'tbl_b'
a = ABWrapper.objects.filter(a__isnull=False).extra(select={'tempID':'a__id'}).values_list('tempID')
b = ABWrapper.objects.filter(b__isnull=False).extra(select={'tempID':'b__id'}).values_list('tempID')
queryset = a | b

Error:
ValueError: When merging querysets using 'or', you cannot have extra(select=...) on both sides.
我正在尝试创建此查询

SELECT id,name FROM tbl_a UNION (SELECT b.id,b.name From tbl_b b)
我的工会尝试

a = A.objects.values_list('id')
b = B.objects.values_list('id')
queryset = a | b

Error:
AssertionError: Cannot combine queries on two different base models.
现在我以这种方式尝试使用父模型

class ABWrapper(models.Model):
    objects = models.GeoManager()
    class Meta:
        db_table = u'ab_wrapper'
将此模型添加为两个模型之上的ForeignKey

a = ABWrapper.objects.filter(a__isnull=False).values('a__id')
b = ABWrapper.objects.filter(b__isnull=False).values('b__id')
queryset = a | b

Error:
TypeError: Merging 'GeoValuesQuerySet' classes must involve the same values in each case.
通过使用别名进行另一次尝试

class A(models.Model):
    name = models.CharField(max_length=240, blank=True)
    geometry = models.GeometryField(blank=True, null=True)
    abwrapper= models.ForeignKey(ABWrapper)

    class Meta:
        db_table = 'tbl_a'

class B(models.Model):
    name = models.CharField(max_length=240, blank=True)
    link = models.IntegerField(blank=True, null=True)
    geometry = models.GeometryField(blank=True, null=True)
    abwrapper= models.ForeignKey(ABWrapper)

    class Meta:
        db_table = 'tbl_b'
a = ABWrapper.objects.filter(a__isnull=False).extra(select={'tempID':'a__id'}).values_list('tempID')
b = ABWrapper.objects.filter(b__isnull=False).extra(select={'tempID':'b__id'}).values_list('tempID')
queryset = a | b

Error:
ValueError: When merging querysets using 'or', you cannot have extra(select=...) on both sides.
我在上面搜索过,主要回答这个问题是使用两种模型的列表。但我不想使用list,因为我使用的是Django Rest框架,所以我需要QuerySet。所以我的问题是,如果我使用list进行union,我可以将结果列表转换为QuerySet吗

注意:我不想在Django中使用SQL查询


有没有其他方法可以完成此任务?

您可以在django中使用Q对象进行复杂筛选。查看实现详细信息。

查看上面的问题不会从django.db返回queryset。模型导入Q queryset=ABWrapper.objects.filter(Q(a_uisNull=False)| Q(b_uisNull=False)`不起作用?去派对很晚了,但我遇到了这个,最后写了一个小包装纸…可能是