3

我想序列化与另一个模型具有一对多关系的对象的查询集。我想在我的 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

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

4

3 回答 3

6

您不能从默认的 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()])
于 2012-12-27T09:40:05.680 回答
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')
于 2012-12-27T11:07:34.353 回答
1

去年,我需要类似的东西,与 Flask 一起工作。我用了这个线程。它会给你这样的东西:

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 的答案几乎相同。唯一的区别是您可以链接序列化方法。

于 2017-10-02T17:19:01.983 回答