【发布时间】:2019-06-11 01:40:12
【问题描述】:
我有这些模型:
class Item(models.Model):
name = models.CharField(max_length=100)
class Group(models.Model):
name = models.CharField(max_length=100)
class ItemGroup(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
意味着一个项目可以在多个组中。
我想查询所有个项目,并为每个项目返回他的组作为嵌套列表(如果项目没有出现在组中,则返回一个空列表)。
这就是我要用 sql 做的事情:
SELECT item.id, item.name, group.name
FROM items
LEFT JOIN item_group ON item.id = item_group.id
LEFT JOIN group ON group.id = item_group.group_id
(我也可以添加一个ORDER BY,用于分页,但现在没关系)。
这个查询会给我每个项目 X 数量的组,该项目也连接,并且至少有一行用于未出现在任何组中的项目(组设置为 null)。
然后,我需要手动将其转换为嵌套列表。
问题:
1. 如何用django ORM做同样的join?这是我发现的最接近的问题:django left join
但答案实际上不是左连接,而是prefetch_related,我想避免这种情况。
2. 如果我要创建一个嵌套的 dict 模型,如下所示:{item: [list of groups for the item]} 。有没有办法将它提供给 django rest 框架序列化程序?因为 ModelSerializer 似乎只能与查询集一起使用。
【问题讨论】:
标签: python django django-models django-rest-framework django-orm