无法使用用例,当,则在Django查询集中

2022-03-16 00:00:00 python django django-queryset

问题描述

我的型号如下

class Loan(models.Model):
  loan_value = models.IntegerField()
  channel_seller = models.ForeignKey(ChannelSeller, on_delete=models.CASCADE)


class ChannelSeller(models.Model):
    LEVEL_CHOICES = (
        ('1','Business Consultants'),
        ('2','Unit Managers'),
        ('3','Account Managers'),
        ('4','Branch Managers'),
    )
    level = models.CharField(max_length=2, choices = LEVEL_CHOICES, null = True, blank = True)
    pin_no = models.CharField(max_length=255)
    unit_manager = models.ForeignKey('self', limit_choices_to = {"level": '2'}, on_delete=models.DO_NOTHING, null = True, blank = True, related_name='unit_manager_2')

贷款可以由business_Consulting或unit_manager创建。每个业务顾问都将有一个unit_manager,但是unit_manager的unit_manager将为空

说到这里

我正在尝试使用CASE,WHEN,THEN按UNIT_MANAGER字段对查询进行排序,如下所示

transactions = Loan.objects.annotate(unit_manager_pin = Case(When('channel_seller__level' == '2', then='channel_seller_pin_no'), When('channel_seller__level' == '1', then='channel_seller__unit_manager__pin_no'))).filter(channel_seller__level__in = ['1','2']).order_by('channel_seller__level')

但是,此查询引发错误__init__() takes either a Q object or lookups as keyword arguments

dbm

您正在编写要由推荐答案执行的查询。您不能在该上下文中使用Python代码('channel_seller__level' == '2')。请参阅conditional expressions上的文档。

请清晰地格式化您的代码!请在括号内使用换行符以继续。

在本例中,您只需将==更改为=,但了解原因很重要。When的参数类似于.filter的参数。因此,要测试大于,应为When( field__gt = 2, ...)

您还需要使用F来引用数据库中的值。如果没有F,它将(可能,不确定)是一个错误。(如果需要固定值,可以使用Value('fixed-value'))

transactions = Loan.objects.annotate(unit_manager_pin =
    Case(When('channel_seller__level' = '2', 
             then=F('channel_seller_pin_no')), 
         When('channel_seller__level' = '1',
             then=F('channel_seller__unit_manager__pin_no'))
         )
    ).filter(
        ...
        

相关文章