Django:序列化查询集并包含一对多关系子项

时间:2012-12-27 08:54:42

标签: django serialization django-queryset

我想序列化与另一个模型具有一对多关系的对象的查询集。我想在json输出中包含相关对象。

示例:

class Book(models.Model):
    title = models.CharField()
    author = models.ForeignKey('Author')

class Author(models.Model):
    name = models.CharField()

view.py:

serializers.serialize('json', Author.objects.all()) #does not include the book objects

我很确定有一个简单的解决方案,但到目前为止我还没弄清楚如何做到这一点。谢谢你的帮助!

3 个答案:

答案 0 :(得分:5)

您无法从默认的django序列化程序中执行此操作,因为Author模型没有books字段。您可以通过创建自己的序列化程序或手动构建数据并将其传递给simplejson.dumps()

来实现它。

更新

例如:

class Author(models.Model):
    ...
    def get_json(self):
        return {
            'id': self.id, 
            'name': self.name,
            'books': [{'id': b.id, 'title': b.title} for b in self.book_set.all()] }

from django.utils import simplejson
simplejson.dumps([a.get_json() for a in Author.objects.all()])

答案 1 :(得分:1)

您要将JSON数据导出到文件吗?如果是,您还可以使用管理命令dumpdata

python manage.py dumpdata your_app.Book your_app.Author > my_models.json

这会将两个模型的数据保存到文件my_models.json

相反,如果要序列化要用于AJAX请求等的数据,可以将模型数据包装在字典中。在你看来做这样的事情:

# The querysets must be wrapped in list()
# otherwise they can't be serialized as JSON objects
response = {  
    'authors': list(Author.objects.all()),
    'books': list(Book.objects.all())
}

return HttpResponse(simplejson.dumps(response), mimetype='application/json')

答案 2 :(得分:0)

去年,我和Flask合作需要这样的东西。我用了this thread。它会给你这样的东西:

class Book(models.Model):
    title = models.CharField()
    author = models.ForeignKey('Author')

    @property
    def serialize(self):
        return {
            'title'    : self.title,
            'author'   : self.author.serialize
        }

class Author(models.Model):
    name = models.CharField()

    @property
    def serialize(self):
        return {
            'name'    : self.name
        }

    @property
    def serialize_books(self):
        return [ book.serialize for book in self.book_set.all() ]

编辑:这个答案与@ sneawo的答案完全相同。唯一的区别是你可以链接序列化方法。