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

Is it possible to get display name from inside concat in Django?

假设我有这个模型:

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 的值作为键,并搜索选项然后 return 正确的值。

是否可以从 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'