问题描述:
有三张表,表1跟表2是一对多的关系,表2跟表3是一对一的关系,如何将表1跟表3连接起来
解决方案
- 用prefetch_related连接表1跟表2,如果此时再创建新的QuerySet会打乱prefetch_related进行的SQL优化,这时候可以使用django.db.models.Prefetch来实现,Prefetch这个提前定义好QuerySet。
- 在Prefetch使用select_related连接表2和表3形成一个新的QuerySet对象
测试代码如下
from django.db import models
# Create your models here.
class GoodsType(models.Model):
"""商品类型模型类"""
name = models.CharField(max_length=20,verbose_name='种类名称')
logo = models.CharField(max_length=20,verbose_name='标识')
class IndexTypeGoodsBanner(models.Model):
"""首页分类商品展示模型类"""
type = models.ForeignKey('GoodsType', verbose_name='商品类型', on_delete=models.CASCADE, related_name='goodsbanner')
sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU', on_delete=models.CASCADE)
index = models.SmallIntegerField(default=0, verbose_name='展示顺序')
class GoodsSKU(models.Model):
"""商品SKU模型类"""
name = models.CharField(max_length=20, verbose_name='商品名称')
from django.shortcuts import render
from django.db.models import Prefetch
from django.db.models.query import QuerySet
from django.db import connection
from .models import GoodsType,IndexTypeGoodsBanner , GoodsSKU
def cs1(request):
goodstypes = GoodsType.objects.prefetch_related(Prefetch('goodsbanner', queryset=IndexTypeGoodsBanner.objects.select_related('sku').all()))
for x in goodstypes:
print("GoodsType.name:",x.name)
Banner= x.goodsbanner.all()
for y in Banner:
print("IndexTypeGoodsBanner.index:", y.index)
print("GoodsSKU.name:", y.sku.name)
print("="*30)
for sql in connection.queries:
print(sql)
return render(request,'cs.html',{"goodstypes":goodstypes})