是否可以从 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'
假设我有这个模型:
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'