Python Django:根据条件选择queryset字段

Python Django:根据条件选择queryset字段,python,sql,django,django-queryset,Python,Sql,Django,Django Queryset,各位 下面是表T的模式(假设模型名也是带有字段A、B和C的T): 现在,我想选择值(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_lis

各位

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

现在,我想选择值(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')]
因此,有两个悬而未决的问题:

  • 有没有更好的方法?(最好使用Queryset/Django ORM函数)

  • 对于数以万计的记录,执行此操作的内存效率/优化方式是什么?除了使用循环(假设主键有序)将queryset限制为更小的块(一次1000条记录)之外,还有其他方法吗

     T.objects.all().values_list('A','C')
    
    max_pkey=T.objects.all().order_by('-pk')[0]
    电流=0
    区块=1000
    
    当前在回答关于超大数据集的第二个问题时,您可能需要查看迭代器:


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

    我想我可以回答第一个问题

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

    Django提供了允许您执行此操作的工具

    来自Django docs

    条件表达式允许您在筛选器、批注、聚合和更新中使用if…elif…else逻辑。条件表达式为表的每一行计算一系列条件,并返回匹配的结果表达式

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

    T.objects.annotate(colA = F('A'), 
                       colB_C = Case(When(C__isnull=True, then=F('B')),
                                     default=F('C')))
    
    对于每一行,如果列C中的值为空,则选择列B中的值。否则,选择C列中的值

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