2017-01-15 15 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を使用します)。

関連する問題