【发布时间】:2020-09-12 02:13:36
【问题描述】:
我想生成一个 json,它是来自多个链接在一起的表的数据聚合(OneToOne 和 ManyToMany 关系)。
models.py
Team(models.Model):
staff = models.OneToOneField(Staff, on_delete=models.CASCADE, related_name='team_staff')
function = models.CharField()
Staff(models.Model):
firstname = models.CharField()
lastname = models.CharField()
courses = models.ManyToManyField(Course, related_name='staff_course')
Course(models.models):
name = models.CharField()
begin= models.DateField()
end = models.DateField()
def __str__(self):
return '%s - %s' % (self.name, self.begin, self.end)
views.py
def all_team(request):
team_query = Team.objects.all().select_related('staff')
team_list = []
for person in team_query:
courses = Staff.objects.get(id=person.staff.id).courses.order_by('-begin')
team_list.append({'fields': {'id': obj.id,
'function': person.function,
'firstname': person.staff.firstname,
'lastname': person.staff.lastname,
'last_course': str(courses.first()),
}})
json_data = json.dumps(team_list, cls=DjangoJSONEncoder)
return HttpResponse(json_data, content_type='application/json')
如您所见,这不是很有效。对于团队的每个成员,您都可以进行查询以获取上一门课程。我们可以添加类似的内容:
staff_query = Staff.objects.all().prefetch_related(Prefetch('courses', queryset=Course.objects.only('name').all()))
并将其与 team_query 合并/组合。
提前感谢您的建议
【问题讨论】:
-
你用的是什么数据库?
-
目前处于项目阶段。我正在使用 SQLite 文件。当它被部署时,我正在考虑使用 Postgres 服务器。
标签: django python-3.x django-views