Django如何合并相同或不同模型的两个查询集?

Django的QuerySet查询为我们提供了一个union()的API,用于合并两个或多个查询集的结果集。查询集可以来自相同或不同的模型。当它们的查询集来自不同的模型时,字段及其数据类型应该匹配。

Django如何合并相同或不同模型的两个查询集?

相同模型之间的合并

以Django自带的User模型为例:

<code>>>> from django.contrib.auth.models import User
>>> User.objects.all()
<queryset>, <user>, <user>, <user>]>
>>> q1 = User.objects.filter(id__gte = 3)    # id大于等于3的用户
>>> q1
<queryset>, <user>]>
>>> q2 = User.objects.filter(id__lt = 2)    # id小于2的用户
>>> q2
<queryset>]>
>>> q1.union(q2)   # 合并相同模型的查询集
<queryset>, <user>, <user>]>
>>> q2.union(q1)
<queryset>, <user>, <user>]>
>>>/<user>/<user>/<queryset>/<user>/<user>/<queryset>/<queryset>/<user>/<queryset>/<user>/<user>/<user>/<queryset>/<code>

不同模型之间的合并

下来我们再来看看不同模型之间如何合并,假如我们有一个UserProfile的模型,里边的字段包含了id,username,email,gender,phone,add_date,下来我们就合并一下User和UserProfile模型的查询集。

<code>>>> from polls.models import UserProfile
>>> from django.contrib.auth.models import User

>>> user_profile = UserProfile.objects.all()
>>> user_profile
<queryset>]>
>>> q1 = User.objects.filter(id__gte=3)
>>> q1
<queryset>, <user>]>

>>> q1.union(user_profile)  # 合并两个不同的模型,这里出现错误
Traceback (most recent call last):
  ....

   return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: SELECTs to the left and right of UNION do not have the same number of result columns/<user>/<queryset>/<queryset>/<code>

注意union只能对具有相同字段和数据类型的查询集执行联合操作。因此,我们的这个联合操作遇到错误。但是django为我们提供了一个values_list的方法用来限制所选字段,所以只要我们选出这两个模型的相同字段进行合并即可成功。

我们知道User具有useranme和email字段,正好我们的UserProfile模型中也有,因此上我们可以利用values_list用来限制所选字段,然后进行并集。

<code>>>> User.objects.all().values_list('username', 'email').union(UserProfile.objects.all().values_list('username', 'email'))

# 查询集合并结果
<queryset>/<code>


如果在这里学到了知识,那么请关注我或加入圈子一起交流学习,这里将持续更新关于django的更多好内容。


分享到:


相關文章: