现有三张表关系如下:
from django.db import models
# Create your models here.
from django.db import models
class BaoModel(models.Model):
age = models.IntegerField()
address = models.CharField(max_length=200)
class ComModel(models.Model):
"""
class com
"""
email = models.EmailField()
content = models.CharField(max_length=200)
created = models.DateTimeField()
port = models.IntegerField()
bao = models.ForeignKey(BaoModel, related_name='BAO', on_delete=models.DO_NOTHING, default=1)
class ZhuModel(models.Model):
"""
class com
"""
name = models.ForeignKey(ComModel, related_name='ZHU', on_delete=models.DO_NOTHING)
class Meta:
db_table = 'zhumodel'
其中,ComModel中有一个外键字段,关联BaoModel,ZhuModel中有个外键字段,关联ComModel表
正向查询
正向查询即为有外键的表去关联查询对应的表,即ZhuModel表去关联查询ComModel表,ComModel表去关联查询BaoModel表
正向查询代码如下:
class UserViewSet(viewsets.ModelViewSet):
queryset = ZhuModel.objects.all()
serializer_class = ComSerializer
pagination_class = StandardResultsSetPagination
@action(detail=False, methods=['get', 'put', 'post'])
def createaa(self, request, pk=None):
queryset = self.get_queryset()
data_list = list()
for item in queryset:
data = dict()
data['name_id'] = item.name_id
data['email'] = item.name.created
data['address'] = item.name.bao.address
data_list.append(data)
return Response(data_list)
我们可以看到,queryset实例为ZhuModel类实例的,通过item.name.created可以关联查询到ComModel表中的信息,item.name.bao.address可以关联查询到BaoModel表中的信息,从而实现多表关联查询。
反向查询
反向查询即为无外键的表去关联查询其他有该表外键的表,有点绕口,就是反过来,即BaoModel表去关联查询ComModel,ComModel去关联查询Zhumodel
反向查询代码如下:
class UserViewSet(viewsets.ModelViewSet):
queryset = ZhuModel.objects.all()
serializer_class = ComSerializer
pagination_class = StandardResultsSetPagination
@action(detail=False, methods=['get', 'put', 'post'])
def createbb(self, request, pk=None):
bao_obj = BaoModel.objects.get(address='liuying')
com_queryset = bao_obj.BAO.all()
data_list = list()
for item in com_queryset:
data = dict()
data['email'] = item.email
data['address'] = item.created
data_list.append(data)
# cs = self.get_serializer(com, many=True)
return Response(data_list)
我们可以看过,先通过BaoModel查询到唯一的实例,然后通过bao_obj.BAO.all()来关联查询到ComModel表中的信息,这里BAO即为ComModel定义时的relation_name='BAO'
至此,正向查询与反向查询简介完成,记录个笔记,待后续翻阅