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的更多好內容。


分享到:


相關文章: