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

标签 python django django-queryset django-orm

假设我有这个模型:

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/

相关文章:

python - Django:从特定用户获取所有对象

python - 如何在 Windows cmd 上从 pip 安装 Pandas ?

python - Pandas:内部联接不返回任何行

Django 请求非常慢,找不到原因

javascript - Django:使用 Javascript 数组解析模板中的 JSON

python - Django 查询在调用后是否保存其结果?

python - 使用Django模板标签执行查询集吗?

Python 修剪列表中的空格

python pandas 传输dataframe的格式

python - Pinax中ACCOUNT_OPEN_SIGNUP = False时如何邀请?