假设我有这个模型:
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/