django ORM 正向查询与反向查询

现有三张表关系如下:

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'

至此,正向查询与反向查询简介完成,记录个笔记,待后续翻阅

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值