2017-08-02 40 views
0

Django的標註值,我有以下型號與模型字段名

class Status(object): 
    FIRST_STATUS = 'FS' 
    SECOND_STATUS = 'SS' 

    CHOICES = ((FIRST_STATUS, 'First Status'), (SECOND_STATUS, 'Second Status') 

class MyModel(models.Model): 
    status = models.CharField(max_length=2, choices=Status.CHOICES) 

我想註釋狀態字段,這樣的結果將持有的可讀價值,而不是狀態代碼。 這就是我要怎樣做:

MyModel.objects.annotate(status=Case(When(status=Status.FIRST_STATUS, then='First Status'), When(status=Status=SECOND_STATUS, then='Second Status'), output_field=CharField())).values('status') 

結果卻是個例外:

`ValueError: The annotation 'status' conflicts with a field on the model.`<br/> 
Which was not surprising because of [this][1] but what is, is that i can do this:<br/><br/>  


MyModel.objects.extra(select={'status': "CASE WHEN status='FS' THEN 'First Status' WHEN status='SS' THEN 'Second Status' ELSE 'Unknown status' END"}).values('status') 

爲什麼把限制的註釋,而不是驗證額外的相同的行爲?有什麼方法可以重寫註釋的限制,並保存我手動構建查詢嗎?

回答

0

不要總使用status,嘗試:

MyModel.objects.annotate(
    status_display=Case(
     When(status=Status.FIRST_STATUS, then='First Status'), 
     When(status=Status.SECOND_STATUS, then='Second Status'), 
    ), 
    output_field=CharField() 
).values('status_display') 

更妙的是:你不需要Case-When也不Status類。 Django的就可以搞定:

在models.py

class MyModel(models.Model): 
    FIRST_STATUS = 'FS' 
    SECOND_STATUS = 'SS' 
    CHOICES = (
     (FIRST_STATUS, 'First Status'), 
     (SECOND_STATUS, 'Second Status') 
    ) 
    status = models.CharField(max_length=2, choices=CHOICES) 

則:

my_models = MyModel.objects.all() # Or filter or any QuerySet 
for model in my_models: 
    status_description = model.get_status_display() 

檢查here以獲取更多信息。