【问题标题】:django double left join + django rest framework serializersdjango double left join + django rest 框架序列化器
【发布时间】: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


    【解决方案1】:

    1) 你想要做的是与 Django 的工作方式背道而驰,这将导致比它价值更多的痛苦。我建议按照建议执行prefetch_related。您可能还想探索以下内容。这是ManyToManyField 上的文档。

    class Item(models.Model):
        name = models.CharField(max_length=100)
    
    class Group(models.Model):
       name = models.CharField(max_length=100)
       items = models.ManyToManyField(Group, through='ItemGroup')
    
    class ItemGroup(models.Model):
       item = models.ForeignKey(Item, on_delete=models.CASCADE)
       group = models.ForeignKey(Group, on_delete=models.CASCADE)
    

    2) 查看ListField。我认为它应该可以帮助你完成你想要的。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2020-03-22
      • 2015-10-29
      • 2020-05-08
      • 1970-01-01
      • 2018-12-13
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多