Django多个外键模型的嵌套Json

穆罕默德·因斯(Mehmet Ince)

我有4个通过FK建立关系的模型。

class Journal(models.Model):
    name = models.CharField(max_length=255)

class Volume(models.Model):
    journal = models.ForeignKey(Journal, related_name='volumes')
    number = models.IntegerField()

class Issue(models.Model):
    volume = models.ForeignKey(Volume, related_name='issues')
    number = models.IntegerField()

class Article(models.Model):
    issue = models.ForeignKey(Issue, related_name='articles')
    title = models.CharField(max_length=255)

我需要像Follow结构这样的JSON格式。

journal: [
    { name: 'Volume number goes here', type: 'folder',  id: 'F1',
        data: [
            { name: 'Issue number goes here', type: 'folder', id: 'F1F1',
                data: [
                    { name: 'Article name goes here>', type: 'item', id: 'F1F1I1' },
                    { name: 'Article name goes here>', type: 'item', id: 'F1F1I2' },
                    { name: 'Article name goes here>', type: 'item', id: 'F1F1I3' },
                ]},
            { name: 'Issue number goes here', type: 'folder', id: 'F1F2',
                data: [
                    { name: 'Article name goes here>', type: 'item', id: 'F1F2I1' },
                    { name: 'Article name goes here>', type: 'item', id: 'F1F2I2' },
                    { name: 'Article name goes here>', type: 'item', id: 'F1F2I3' },
                ]},
        ]
    },
    { name: 'Volume number goes here', type: 'folder',  id: 'F2',
        data: [
            { name: 'Issue number goes here', type: 'folder', id: 'F1F1',
                data: [
                    { name: 'Article name goes here>', type: 'item', id: 'F2F1I1' },
                    { name: 'Article name goes here>', type: 'item', id: 'F2F1I2' },
                    { name: 'Article name goes here>', type: 'item', id: 'F2F1I3' },
                ]},
            { name: 'Issue number goes here', type: 'folder', id: 'F1F2',
                data: [
                    { name: 'Article name goes here>', type: 'item', id: 'F2F2I1' },
                    { name: 'Article name goes here>', type: 'item', id: 'F2F2I2' },
                    { name: 'Article name goes here>', type: 'item', id: 'F2F2I3' },
                ]},
        ]
    }
],

我已经尝试了几种方法,但是它将导致数百个sql查询(由于for循环)

有任何想法吗 ?

白血球

您可以使用4个查询来创建该JSON文件。您只需要使用prefetch_related

这是一些概念证明(要使计数器工作起来,必须具有DEBUG=True):

from django.db import connection

journals = Journal.objects.all().prefetch_related('volumes', 'volumes__issues', 'volumes__issues__articles')

for journal in journals:
    print "%s" % journal.name
    for volume in journal.volumes.all():
        print "  %d" % volume.number
        for issue in volume.issues.all():
            print "    %d" % issue.number
            for article in issue.articles.all():
                print "      %s" % article.title

print len(connection.queries)

这将在最后显示您的对象的简单树和查询数量,等于4(如果之前在该连接中未执行任何查询)。到此为止,创建JSON输出就不远了。

在创建确切的JSON时,Django REST Framework可能会有所帮助。假设您已经完成并嵌套了所有序列化程序,则JournalSerializer使用上面的queryset进行输入,将为数据库创建4个查询。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django中的多个嵌套外键关系

来自分类Dev

Django模型:汇总多个外键字段值的总和

来自分类Dev

如何在映射Django模型中使用多个外键

来自分类Dev

Django Model属性-计算模型的多个实例的外键

来自分类Dev

Django模型,循环外键

来自分类Dev

Django多重外键模型

来自分类Dev

Django Shortcut嵌套外键

来自分类Dev

Django Shortcut嵌套外键

来自分类Dev

在多个页面中带有(外键)的多个模型表单。Django的

来自分类Dev

Django-复制具有2个嵌套外键的模型实例

来自分类Dev

使用多个外键插入Laravel模型

来自分类Dev

CakePHP 2模型关系多个外键

来自分类Dev

Django:使用多个外键为“直通”模型定制内联表单集

来自分类Dev

Django排除对同一模型的多个外键的过滤器

来自分类Dev

django外键(用户)在模型中

来自分类Dev

每个外键的Django模型单个实例

来自分类Dev

Django模型中的外键数组

来自分类Dev

django用户模型公司的外键

来自分类Dev

Django模型:使用外键中的字段

来自分类Dev

Django从模型CharField引入外键

来自分类Dev

Django模型:外键的唯一值

来自分类Dev

Django模型外键获取属性

来自分类Dev

Django模型外键中的属性错误

来自分类Dev

Django模型中的自动外键

来自分类Dev

Django模型中的外键数组

来自分类Dev

django用户模型公司的外键

来自分类Dev

在Django中用外键保存模型

来自分类Dev

Django从模型CharField引入外键

来自分类Dev

Django模型未设置外键对象