无法使用用例,当,则在Django查询集中
问题描述
我的型号如下
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(
...
相关文章