Django:根据条件选择queryset字段

2024-05-03 13:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

各位

下面是表T的模式(假设模型名也是T,字段A、B和C):

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

现在,我要选择值(A、C或B)。我可以选择A和C,如下所示:

^{pr2}$

但它只给我A和C值。我只想如果C为NULL,那么我应该得到B。我不知道是否可以直接使用任何条件或join来实现这一点(抱歉,我不是SQL人员),但我肯定可以通过以下方式实现:

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

因此,有两个开放性问题:

  1. 有没有比这更好的方法呢?(最好使用Queryset/Django ORM函数)

  2. 如果有成千上万条记录,内存效率/优化的方法是什么?除了使用如下循环(假设有序主键)将queryset限制为更小的块(假设一次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
    

Tags: 方法模型objects记录模式currentall条件
2条回答

对于非常大数据集的第二个问题,您可能需要看看迭代器:

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

因为这不会尝试在评估时加载整个数据集,但显然存在权衡。在

我想我能回答第一个问题。在

1。有更好的办法吗?(最好使用Queryset/Django ORM函数)

Django提供了Conditional expressions允许您这样做。在

从Django docs

Conditional expressions let you use if … elif … else logic within filters, annotations, aggregations, and updates. A conditional expression evaluates a series of conditions for each row of a table and returns the matching result expression.

对于您提供的架构,可以使用以下内容:

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

对于每一行,如果C列中的值为空,则选择B列中的值。否则,选择C列中的值。在

相关问题 更多 >