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"
}
]
}
]
在这种情况下,您将利用prefetch_related
的优势,它执行两个SQL查询并执行内存中的JOIN。
queryset = MainCategory.objects.prefetch_related('subcategory_set')
然后您遍历此查询集,以其子类别序列化每个对象,而无需访问数据库。
更多信息。在此处的官方文档中:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#prefetch-related