我想序列化与另一个模型具有一对多关系的对象的查询集。我想在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
我很确定有一个简单的解决方案,但到目前为止我还没弄清楚如何做到这一点。谢谢你的帮助!
答案 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的答案完全相同。唯一的区别是你可以链接序列化方法。