【问题标题】:ManyRelatedManager object at [XXX] is not JSON serializable[XXX] 处的 ManyRelatedManager 对象不是 JSON 可序列化的
【发布时间】:2015-10-27 09:52:49
【问题描述】:

我有一个带有 ManyToManyFields 的简单模型,我正在序列化为 JSON:

models.py:

class Meeting(models.Model):
    site = models.ForeignKey(Site)
    meeting_title = models.CharField(default='', max_length=128, blank=True, null=True)
    meeting_team_members = models.ManyToManyField(Team, blank=False, null=False) # hosts
    meeting_visitors = models.ManyToManyField(Visitor, blank=False, null=False) # invited guests

views.py:

instances = Meeting.objects.filter(site=site.id)

for ins in instances: #populate list
     context.append({
        'meeting_title': ins.meeting_title, 
        'meeting_team_members':ins.meeting_team_members.all, 
        'meeting_visitors': ins.meeting_visitors.all, 

json_context = json.dumps(context, cls=DjangoJSONEncoder) #dump list as JSON
return HttpResponse(json_context, 'application/javascript')

但是我得到以下类型错误:

TypeError at /dashboard/get_meetings/
<django.db.models.fields.related.create_many_related_manager.<locals>.ManyRelatedManager object at 0x03406730> is not JSON serializable

【问题讨论】:

  • 您需要使用某种序列化程序。它无法将meeting_team_members 序列化为 json。您是否考虑过使用django-rest-framework 来构建您的 api?它有一些非常好的类来构建序列化程序。
  • @Brobin 是的,但这是一个单一的用例,所以django-rest-framework 似乎有点矫枉过正。有没有其他办法解决这个问题?
  • 您是否尝试将ins.meeting_team_members.all 更改为ins.meeting_team_members.all()?等等。所以函数被调用了?
  • @Brobin 是的,然后错误是[&lt;Visitor: visitor2&gt;] is not JSON serializable

标签: python json django django-models getjson


【解决方案1】:

如果@Brobin 的建议由于某种原因没有帮助...

meeting_team_members = [x.as_dict() for x in ins.meeting_team_members.all()]

class Team(models.Model):
    # ... example fields
    def as_dict(self):
        context = {
            'pk': self.id,
            'name': self.name,
            'description': self.description,
        }

        if self.image:
            context['image'] = get_thumbnail(self.image, '150').url
            context['full_image'] = self.image.url
        else:
            context['no_image'] = _(u'No image)  # this is just for localization

        return context

编辑

for ins in instances: #populate list
     context.append({
        'meeting_title': ins.meeting_title, 
        'meeting_team_members':[x.as_dict() for x in ins.meeting_team_members.all()]
     })

【讨论】:

  • 谢谢,你能解释一下这里的逻辑吗?你正在解决什么问题,你是怎么做的?谢谢
  • 我实际上是在将as_dict 中的对象序列化为 JSON(可接受的格式)...更新答案
  • 谢谢。我不明白模型中的as_dict(self)meeting_team_members 有什么关系?这样做的目的是什么?
  • 其实ins.meeting_team_members.all()返回所有与当前实例相关的Team对象...docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many
  • 我已尝试应用此代码,结果为'Team' object has no attribute 'as_dict'
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2021-08-29
  • 2020-09-06
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2015-02-24
相关资源
最近更新 更多