【问题标题】:Python Serialization (to JSON) issuePython序列化(到JSON)问题
【发布时间】:2011-11-09 21:54:30
【问题描述】:

我是 Python 的新手,所以请放轻松。我正在 Django 中编写一个 AJAX 处理程序。到目前为止,一切都非常简单。在一天的大部分时间里,我一直在用头撞这个东西。我想返回一个 JSON 字符串,其中包含一个包含查询集的 dict:

#
# models.py
#

class Project(models.Model):
  unique_name  = models.CharField(max_length=32, unique=True)
  title        = models.CharField(max_length=255, blank=True)
  description  = models.TextField('project description', blank=True)
  project_date = models.DateField('Project completion date')
  published    = models.BooleanField()

class ProjectImage(models.Model):
  project      = models.ForeignKey('Project', related_name='images')
  image        = models.ImageField(upload_to=get_image_path)
  title        = models.CharField(max_length=255)
  sort_metric  = models.IntegerField()


#
# views.py
#
...
projects = Project.Project.objects.filter(published=True)
...
response_dict({
  'success' : True,
  'maxGroups' : 5, # the result of some analysis on the projects queryset
  'projects' : projects
});

# This one works if I remove 'projects' from the dict
# response = json.dumps( response_dict )

# This one works only on projects
# response = serializers.serialize( 'json', response_dict, relations=('images') )

return HttpResponse( response, mimetype='application/javascript' )

我已经注释掉了两个序列化行,因为:

  1. 第一个似乎只适用于“简单”的 dicts,并且由于项目包含在我的 dicts 中,它失败了 [<Project: Project object>] is not JSON serializable
  2. 第二个似乎只适用于查询集/模型,并且由于我的 dict 的“外部”部分是非模型的,它抱怨 'str' object has no attribute '_meta'。请注意,我使用 wadofstuff 序列化程序的理解是,它将解决我的模型中定义的 OneToMany 关系。但即使我仅通过序列化 projects 来实现此功能,输出中也没有任何 ProjectImages。

问题 1:序列化整个response_dict 的最佳方法是什么?当然,我不是第一个想要这样做的人,对吧?

问题 2:为什么我无法让多对一关系发挥作用?

非常感谢您的帮助。

更新:刚刚找到这个:Django JSON Serialization with Mixed Django models and a Dictionary,它看起来很有希望,但我得到了'QuerySet' object has no attribute '_meta' =(

【问题讨论】:

    标签: python json serialization


    【解决方案1】:

    你不能像那样序列化一个 python 对象。 django 文档中有一节介绍了该做什么。

    https://docs.djangoproject.com/en/dev/topics/serialization/#id2

    这是要查看的关键部分:

    json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
    

    【讨论】:

    • 这与哪个问题有关?没有。 1 或没有。 2?我认为你的建议只允许我序列化查询集——我已经可以按照上面提到的那样执行此操作,但是,我似乎无法在序列化结果中包含非查询集信息。
    • 它与问题#1有关,如果您序列化项目,您应该能够序列化整个响应字典。
    • 迟到总比没有好=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多