2017-08-24 31 views
1

我有以下字段和裝飾的典範:是否有可能使用Model.values()模型的@property裝飾器?

class Item(models.Model): 

    title = models.CharField(db_index=True, max_length=100) 
    thumb = models.CharField(max_length=1000) 
    vendor = models.CharField(max_length=15) 
    url = models.CharField(max_length=255, unique=True) 
    views = models.CharField(max_length=64) 

    @property 
    def parsed_thumb() 
     return = self.url + "/static/" + self.thumb 

這是我在一個基於類視圖查詢有:

results = Items.objects.filter(title__icontains=query).order_by('-views')[offset:limit].values('id', 'url', 'title', 'vendor', 'thumb') 

的問題是調用values()返回數據庫字段,併爲據我所知,無法與屬於Items模型的@property裝飾器進行交互。

我需要parsed_thumb()的返回值。我有什麼選擇?

+3

您確實需要使用'值()'?爲什麼不使用常規的查詢集並訪問該屬性? – Alasdair

回答

2

查詢集是否有與數據庫中,作爲屬性只能訪問模型進行交互。你可以標註使用Concat的查詢集工作的性質,但這不會使用屬性

results = Items.objects.filter(title__icontains=query).order_by('-views') 
results = results.annotate(parsed_thumb=Concat('url', Value('/static/'), 'thumb'))[offset:limit].values('id', 'url', 'title', 'vendor', 'thumb', 'parsed_thumb') 
+0

我喜歡這個解決方案,它適用於我遇到的問題,所以我會將其標記爲正確。不幸的是,我簡化了這個問題,所以我可以很容易地解釋它。我也有其他領域,需要從二進制轉換爲十進制,以及其他修改。我很快試圖擴展你的答案,爲我的其他問題工作如下所示: 'results = results.annotate(dec_num = self.bin_to_dec(bin_field))''但它看起來像我只能使用鏈接中的Django數據庫函數提供。不過,謝謝你爲我提出的問題提供了一個很好的答案。 – Sam

+0

@Sam - 您可能會感到困難(請參閱[Django自定義註釋函數](https://stackoverflow.com/q/30416270/1324033))。這裏的答案建議使用額外的內容,但是在django文檔中使用額外的內容會有很大的警告。 – Sayse

+1

是的,我越看這個問題,我越發現它可能會變得混亂。出於顯而易見的原因,我真的不想使用'extra()'。 – Sam

1

如果你有這樣簡單的方法,你可以嘗試使用QuerySet.extra

results = Items.objects.extra(
    select={'parsed_thumb': "url || '/static/' || thumb"} 
).filter(title__icontains=query).order_by('-views')[offset:limit].values(
'id', 'url', 'title', 'vendor', 'thumb', 'parsed_thumb') 
相關問題