代码之家  ›  专栏  ›  技术社区  ›  alias51

[XXX]处的ManyRelatedManager对象不可JSON序列化

  •  1
  • alias51  · 技术社区  · 9 年前

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

    型号.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
    

    视图.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:

    TypeError at /dashboard/get_meetings/
    <django.db.models.fields.related.create_many_related_manager.<locals>.ManyRelatedManager object at 0x03406730> is not JSON serializable
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   madzohan justinw    9 年前

    如果@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()]
         })