gpt4 book ai didi

python - 如何从列表中调用 django 模型字段名称?

转载 作者:行者123 更新时间:2023-11-30 22:11:37 27 4
gpt4 key购买 nike

django 模型.py

class mymodel(models.Model):
date_check = models.DateField()
item_1 = models.NullBooleanField()
item_2 = mod`enter code here`els.NullBooleanField()
item_3 = models.NullBooleanField()
item_4 = models.NullBooleanField()
item_5 = models.NullBooleanField()

任务:

>>> from .models import mymodel
>>>
>>> a_list = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5', 'item_5', ]
>>> a_year = 2018
>>> param1 = {}
>>> param2 = {}
>>> param3 = {}
>>> for item in a_list :
>>> param1[item] = mymodel.objects.filter(date_check__year = a_year, item=True).count()
>>> param2[item] = mymodel.objects.filter(date_check__year = a_year, item=False).count()
>>> param3[item] = mymodel.objects.filter(date_check__year = a_year, item=None).count()
.....error here

我们如何从列表中调用字段名称?

最佳答案

这里item被解释为标识符,因此参数的名称是item。存在具有相同名称和特定值的变量这一事实是不相关的。

但是,我们可以通过构建一个字典将 item(因此这里它将被替换为相应的值)映射到 TrueFalse。我们可以使用两个连续的星号作为前缀,将此字典用作命名参数字典*:

for item in a_list :
param1[item] = mymodel.objects.filter(date_check__year=a_year, <b>**{item: True}</b>).count()
param2[item] = mymodel.objects.filter(date_check__year=a_year, <b>**{item: False}</b>).count()
param3[item] = mymodel.objects.filter(date_check__year=a_year, <b>**{item: None}</b>).count()

请注意,这将导致多个查询。我们可以通过聚合选择来减少查询量,例如:

qs = mymodel.objects.filter(date_check__year=a_year)

for item in a_list :
data = qs.aggregate(
p1=Count('pk', filter=Q(**{item: True}))
p2=Count('pk', filter=Q(**{item: False}))
p3=Count('pk', filter=Q(**{item: None}))
)
param1[item] = data['p1'] or 0
param2[item] = data['p2'] or 0
param3[item] = data['p3'] or 0

因此,我们对每个查询计算个事物:TrueFalseNone的数量s。我们实际上可以扩展这个逻辑,甚至可以在单个查询中计算所有内容,这通常会更有效(这本身不是真的,但进行查询通常会导致构建查询的一些开销,在数据库端解释查询、序列化结果等)。

关于python - 如何从列表中调用 django 模型字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51365145/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com