【问题标题】:Deep JSON Serialization of Django objectsDjango 对象的深度 JSON 序列化
【发布时间】:2011-01-23 11:42:01
【问题描述】:

考虑以下 Django 模型:

class Event(models.Model):

    startDate = models.DateField()
    endDate = models.DateField()

    user = models.ForeignKey(User, null=True)

后来在我看来我会这样做:

django.core.serializers.serialize("json", Event.objects.all())
return HttpResponse(data, mimetype='application/javascript')

并得到以下响应:

[
  {
    "pk": 1, 
    "model": "myapp.event", 
    "fields": {
      "startDate": "2010-02-02", 
      "endDate": "2010-02-02", 
      "user": 2
    }
  }
]

是否可以让序列化程序“更深入”并序列化 Event 实例引用的用户,以便我可以在我的 Javascript 代码中访问该数据?

使用开发版本似乎可以做到这一点,但我使用的是 1.1 FWIW。

【问题讨论】:

    标签: django json django-models


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      django-tastypie 可以解决问题。它对这样的深层关系提供各种支持,并遵守 REST,这意味着如果您使用 jQuery,一个简单的$.ajax() 就可以获取数据。

      因为 sweetpie 遵循 REST,它还支持分别使用 PUTPOSTDELETE 方法进行更新、插入和删除。

      它也支持 JSON、XML 和 YAML。它有助于构建一个完整的 REST API,这对于您正在尝试做的事情可能看起来有点迟钝,但它很容易设置,并允许您完全自定义返回哪些字段以及排除哪些字段。

      在您的 API 中,您可以执行以下操作:

      from tastypie.resources import Resource
      from django.contrib.auth.models import User
      from myapp import models
      
      class UserResource(Resource):
          class Meta:
              queryset = User.objects.all()
              resource_name = 'user'
      
      class EventResource(Resource):
          user = fields.ToOneField(UserResource, full=True)
          class Meta:
              queryset = models.Event.objects.all()
              resource_name = 'event'
      

      这不会完全按照您指定的格式返回,但它很容易配置,并且符合网络标准,随着项目的发展,它变得更加有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 2012-05-14
        • 2018-09-12
        相关资源
        最近更新 更多