【问题标题】:Django - get serialized fields from related modelDjango - 从相关模型中获取序列化字段
【发布时间】:2017-01-15 23:03:10
【问题描述】:

我不知道如何序列化包含来自反向相关模型的字段的查询。我的模型看起来像这样。每张投票都与一张专辑相关联:

# 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 文档,“只有模型上本地定义的字段才会被序列化。”

所以我的问题是,我如何获得以下序列化结果(假设 Abbey Road 有 100 票,Astral Weeks 有 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
},
...
]

【问题讨论】:

    标签: django serialization django-models django-views


    【解决方案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 的东西)。

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2023-03-25
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多