簡體   English   中英

Django:根據條件選擇查詢集字段

[英]Django: Selecting queryset fields based on a condition

民間,

這是表T的架構(假設模型名稱也是T,其中包含字段A,B和C):

 A    B   C
---  --- ---
 1    a   b
 2    b   NULL
 3    c   c

現在,我要選擇值(A,C或B)。 我可以如下選擇A和C:

 T.objects.all().values_list('A','C')

但這只會給我A和C值。 我只想如果C為NULL,那么我應該得到B。我不知道我是否可以使用任何條件或聯接直接實現此功能(對不起,我不是SQL專家),但是我絕對可以使用以下方法實現此功能:

 [(x,z or y) for (x,y,z) in T.objects.all().values_list('A','B','C')]

因此,有兩個懸而未決的問題:

  1. 有什么更好的方法嗎? (最好使用Queryset / Django ORM函數)

  2. 對於成千上萬的記錄,執行此操作的內存效率/優化方式是什么? 除了使用循環(假設有序的主鍵)將查詢集限制為較小的塊(假設一次有1000條記錄)以外,還有什么方法可以使用:

     max_pkey = T.objects.all().order_by('-pk')[0] current = 0 chunk = 1000 while current <= max_pkey: objs = T.objects.filter(pk__gt=current)[:chunk] Process the objects 

在回答有關非常大的數據集的第二個問題時,您可能需要查看迭代器:

https://docs.djangoproject.com/zh-CN/dev/ref/models/querysets/#django.db.models.query.QuerySet.iterator

因為這不會在評估時嘗試加載整個數據集,但是顯然存在一些折衷。

我想我可以回答第一個問題。

1.有更好的方法嗎? (最好使用Queryset / Django ORM函數)

Django提供了條件表達式 ,您可以執行此操作。

從Django文檔中,

條件表達式使您可以使用if…elif…else過濾器,注釋,聚合和更新中的邏輯。 條件表達式為表的每一行評估一系列條件,並返回匹配的結果表達式。

對於您提供的模式,可以使用以下命令:

T.objects.annotate(colA = F('A'), 
                   colB_C = Case(When(C__isnull=True, then=F('B')),
                                 default=F('C')))

對於每一行,如果C列中的值為null,則選擇B列中的值。 否則,將選擇C列中的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM