django - 如何在 Django 查询集中创建联合

标签 django django-rest-framework

我在项目中使用 Django REST Framework,我想创建两个不同模型的联合。

我的模型

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'

我正在尝试创建此查询
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'

将此模型添加为两个模型上方的外键
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.

另一种尝试使用别名
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.

我已经搜索过它,主要回答了这个问题,因为这两个模型都使用列表。但是我不想使用列表,因为我使用的是 Django Rest Framework,所以我需要 QuerySet。所以我的问题是,如果我使用列表进行联合,是否可以将结果列表转换为 QuerySet。

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

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

最佳答案

你可以在django中使用Q对象进行复杂的过滤。看this_link实现细则。

关于django - 如何在 Django 查询集中创建联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23110658/

相关文章:

Django 身份验证和加密 - 它是如何工作的?

python - Django View 类: name 'self' is not defined

python - 如何序列化字符串列表

django - 使用 django_filter 过滤模型的计算方法

javascript - 具有多个允许主机的 Django 和 CORS 策略

django - 重用 Django Rest Framework 嵌套序列化器中的现有对象

DJango REST Framework 只读字段

python - Django休息框架: Serializing a model and grouping by a foreign key for other data

python - 过滤登录用户创建的预订

python - 如何访问本地网络上运行的服务器