如何在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以获取实现详细信息.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |