gpt4 book ai didi

python - 是否可以从 Django 中的 concat 内部获取显示名称?

转载 作者:行者123 更新时间:2023-12-01 07:20:41 25 4
gpt4 key购买 nike

假设我有这个模型:

class Cable(models.Model):
id = models.OneToOneField(Item, primary_key=True, on_delete=models.CASCADE)
type = models.IntegerField(choices=choices.cableTypes, default=1)
notes = models.TextField(blank=True)
length = models.DecimalField(decimal_places=2, max_digits=6)
objects = CableQuerySet().as_manager()

def __str__(self):
return str(self.get_type_display()) + " Cable, " + str(self.length) + "m"

我需要能够使用__str__从数据库中提取结果,但事实证明这是不可能的。因此,建议我使用 .annotate()Concat() 来达到相同的结果。

我的问题是我需要 Cable.type 的显示名称而不是值,或者我需要能够使用 type 的值作为键,并用它搜索选项,然后返回正确的值。

是否可以从 concat 内部获取显示名称,或者我可以做些什么来提供类似的结果?

编辑:以下是电缆类型:

cableTypes = (
(1, "Not Specified"),
(2, "XLR"),
(3, "DMX")
)

最佳答案

严格来说,您可以这样做,但通常最好这样做,因为它会导致查询看起来不> 非常好。

我们可以在此处使用注释将 type 替换为其显示等效项,例如:

from django.db.models import Case, CharField, Concat, Value, When
from django.db.models.functions import Concat

Cable.objects.annotate(
text = Concat(
Case(
<b>*[When(type=t, then=Value(d, output_field=CharField()))
for t, d in choices.cableTypes]</b>,
output_field=CharField()
),
Value(' Cable, ', output_field=CharField()),
'length',
Value('m', output_field=CharField()),
output_field=CharField()
)
)

从此查询集中产生的 Cable 将有一个名为 text 的额外值,其中包含一个字符串,我希望该字符串具有与 相同的值__str__ 会产生。

例如:

>>> Cable.objects.create(type=2, length=1.2)
<Cable: XLR Cable, 1.2m>
>>> qs.all()[0].text
'XLR Cable, 1.20m'

关于python - 是否可以从 Django 中的 concat 内部获取显示名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716529/

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