加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何在Django queryset中创建Union

发布时间:2020-12-20 13:42:03 所属栏目:Python 来源:网络整理
导读:我在项目中使用Django REST Framework,我想创建union两个不同的模型. 我的模特 class A(models.Model): name = models.CharField(max_length=240,blank=True) geometry = models.GeometryField(blank=True,null=True) abwrapper= models.ForeignKey(ABWrappe
我在项目中使用Django REST Framework,我想创建union两个不同的模型.

我的模特

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'

在两个模型上方添加了此模型作为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.

做别名的另一种尝试

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 Framework,所以我需要QuerySet.所以我的问题是如果我使用list for union我可以将结果列表转换为QuerySet.

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

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

解决方法

您可以在django中使用Q对象进行复杂过滤.请参阅 this_link以获取实现详细信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读