DJango外键查询优化

问题描述 投票:-2回答:1
class MainCategory(models.Model):
    main_category_id = models.PositiveSmallIntegerField(primary_key=True)
    name = models.CharField(max_length=30)
    image = models.URLField(null=True)

    class Meta:
        db_table = 'lookup_main_category'

    def __str__(self):
        return self.name

class SubCategory(models.Model):
    sub_category_id = models.PositiveSmallIntegerField(primary_key=True)
    main_category = models.ForeignKey(MainCategory, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    image = models.URLField(null=True)

    class Meta:
        db_table = 'lookup_sub_category'

    def __str__(self):
        return self.name

我在DJango REST框架项目中拥有上述2个模型,并且需要如下所示的API输出。没有典型的for循环以获取不同的主要类别然后在sub_category表中对其进行循环的最佳查询是什么?

[
  {
    "main_category_id": "10",
    "main_category_name": "main_name1",
    "image": "http://example/com1",
    "sub_categories": [
      {
        "sub_category_id": "20",
        "sub_category_name": "sub_name1",
        "image": "http://example/com1"
      },
      {
        "sub_category_id": "21",
        "sub_category_name": "sub_name2",
        "image": "http://example/com"
      }
    ]
  },
  {
    "main_category_id": "11",
    "main_category_name": "main_name2",
    "image": "http://example/com2",
    "sub_categories": [
      {
        "sub_category_id": "22",
        "sub_category_name": "sub_name2",
        "image": "http://example/com2"
      }
    ]
  }
]
django django-models django-rest-framework
1个回答
0
投票

在这种情况下,您将利用prefetch_related的优势,它执行两个SQL查询并执行内存中的JOIN。

queryset = MainCategory.objects.prefetch_related('subcategory_set')

然后您遍历此查询集,以其子类别序列化每个对象,而无需访问数据库。

更多信息。在此处的官方文档中:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#prefetch-related

© www.soinside.com 2019 - 2024. All rights reserved.