2017-01-15 140 views
0

我無法弄清楚如何序列化的查詢,包括從反向相關模型領域取得系列化領域。我的模型看起來像這樣。每個投票鏈接到單個相冊:Django的 - 從相關模型

# models.py 

class Album(models.Model): 
    name = models.CharField(max_length=50) 

class Vote(models.Model): 
    album = models.ForeignKey(Album, on_delete=models.CASCADE) 
    user_vote = models.BooleanField(default=0) 

我希望做的是執行返回所有專輯的對象,以及歸屬於該相冊中票和查詢。這是很容易的,但是當我序列化的查詢中,「total_votes」字段丟失:

# views.py 

# this works fine 
query = Album.objects.annotate(total_votes = Sum(vote__user_vote)) 

# after serialization, I lose the field "total_votes" 
serialized = serializers.serialize('json', list(query)) 
return serialized 

不幸的是,本場「total_votes」中沒有出現,因爲序列化結果,根據Django文檔,「只那些在本地模型中定義的字段將被序列化。」

所以我的問題是,我怎麼得到以下序列化結果(假設有100票對艾比路和150星際周)?任何幫助將不勝感激。

[ 
{ 
    "pk": 1, 
    "model": "app.album", 
    "fields": { 
    "name": "Abbey Road", 
    "total_votes": 100 
}, 
{ 
    "pk": 2, 
    "model": "app.album", 
    "fields": { 
    "name": "Astral Weeks", 
    "total_votes": 150 
}, 
... 
] 

回答

1

根據消息來源,沒有辦法使用serializers.serialize來做到這一點。該基地Django的序列化器將只在模型實例序列local_fields

 for field in concrete_model._meta.local_fields: 
      if field.serialize: 
       if field.remote_field is None: 
        if self.selected_fields is None or field.attname in self.selected_fields: 
         self.handle_field(obj, field) 
       else: 
        if self.selected_fields is None or field.attname[:-3] in self.selected_fields: 
         self.handle_fk_field(obj, field) 
     for field in concrete_model._meta.many_to_many: 
      if field.serialize: 
       if self.selected_fields is None or field.attname in self.selected_fields: 
        self.handle_m2m_field(obj, field) 

爲了得到你想要的東西,你必須推出自己的序列化功能(例如,一些模型轉換爲一個字典和然後使用DjangoJSONEncoder)。