簡體   English   中英

django:帶有查詢集值的選擇顯示

[英]django: choice display with queryset values

我想在模板上使用 get_status_display,來自一個只有模型中一些字段的查詢集。

我有一個帶有選擇字段(狀態)的模型。

class Operation(models.Model, ModelMixin):
    operation_area = models.ForeignKey('operations.OperationArea', null=True)

    created = models.DateTimeField(auto_now=True)
    indication = models.NullBooleanField()
    observation = models.TextField(blank=True, null=True)
    rate = models.IntegerField(blank=True, null=True)
    scheduling = models.DateTimeField(blank=True, null=True)
    status = models.IntegerField(choices=OPERATION_TYPE)

class OperationArea(models.Model, ModelMixin):
    campaign = models.ForeignKey('campaigns.Campaign')
    person = models.ForeignKey('registrations.Person')
    user = models.ForeignKey('authentication.User')

    area = models.CharField(max_length=1, choices=OPERATION_AREA)

我的查詢是:

Operation.objects.filter(operation_area__user=user).values('id', 'created', 'operation_area__person__name', 'status')

由此得到一個 dict,但 get_FOO_dislpay 是一個實例方法,不適用於 dict。 我不想使用 .only() 因為他帶來了operation_area對象並獲取person.name他進行了另一個查詢,就像這個operation.operation_area.person.name 任何想法如何處理一個查詢和 get_FOO_display?

我認為annotate()就是你要找的。

使用提供的查詢表達式列表注釋 QuerySet 中的每個對象。 表達式可以是一個簡單的值、對模型(或任何相關模型)上的字段的引用,或者是在與模型中的對象相關的對象上計算出的聚合表達式(平均值、總和等)。查詢集。

annotate() 的每個參數都是一個注釋,將添加到返回的 QuerySet 中的每個對象。

Django 提供的聚合函數在下面的聚合函數中描述。

使用關鍵字參數指定的注釋將使用關鍵字作為注釋的別名。 匿名參數將根據聚合函數的名稱和正在聚合的模型字段為它們生成一個別名。 只有引用單個字段的聚合表達式才能是匿名參數。 其他所有內容都必須是關鍵字參數。

你應該使用:

operations.annotate(person_name=F('operation_area__person__name')) 

看看https://docs.djangoproject.com/en/2.0/ref/models/querysets/#annotate

我知道現在回復已經很晚了。 盡管如此,我認為我的解決方案值得分享:

def display_value(choices,field):
    options = [
         When(**{field: k, 'then': Value(v) })
          for k,v in choices
    ]
    return Case(
        *options,output_field=CharField()
    )

你可以使用:

my_field = {'field_value': display_value(CHOICES, 'field'),}
YourModel.objects.annotate(**my_field)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM