我有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] 删除。
我来说两句