2017-01-15 33 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)。