Django ORM 非关联关系序列化反向查询

  当看到物理外键的时候,第一反应是有物理外键那一定有逻辑外键,那我熟悉的外键是什么?

        物理外键指的是使用foreign key 作为外键关联另一张的字段的连接方法,而且限定了引擎为InnoDB,而逻辑外键,又叫做事实外键,是因为存在语法上的逻辑关联而产生的外键,需要有连接关键词inner join 或者left join 等等和连接部分,也就是on后面的部分,如果需要对应的设置,也可以加上set等语句。

为何说所有物理外键删除,因为外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况
 
使用Django框架操作orm 使用物理外键 取订单表内的user_id对应的user信息:
# 用户表
class UserModel(models.Model):
    name = models.CharField(max_length=64, verbose_name='用户名')
    phone = models.CharField(null=False, max_length=64, verbose_name='手机号')
    createtime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        db_table = '用户'
        verbose_name = "用户"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# 订单表
class OrderModel(models.Model):
    user_id = models.IntegerField(null=False, blank=False, verbose_name='用户ID')  # 这里就存在了关系  用户下的订单  
    title = models.CharField(max_length=255, verbose_name='标题')
    price = models.FloatField(null=False, max_length=6, default=0, verbose_name='任务单价')
    num = models.IntegerField(null=False, verbose_name='任务数量')
    createtime = models.CharField(max_length=255, null=False, blank=False, verbose_name='发布任务时间')

    class Meta:
        db_table = ' 订单表'
        verbose_name = " 订单表"
        verbose_name_plural = verbose_name

这样这两张表实际上没有关联关系,但是我们将用户的id存入了订单表 当我们查询数据的时候就可以直接按照用户ID进行查询

那么如果我要查这个订单属于哪个用户的 一般都是 把user_id取出来 在根据user_id在user表进行查找  这样效率不是特别高 

我们可以通过序列化进行反向查询 


from rest_framework import serializer
#订单序列化
class OrderSerializer(ModelSerializer):
    user = serializers.SerializerMethodField()  #这里要给订单表定一个字段也就是我们的用户userclass Meta:
        model = models.TaskModel
        fields = '__all__'

    def get_user(self, obj):
         user_dict = {}  #将你想要查询user的字段添加到dict内
         user_dict['name'] = models.UserModel.objects.filter(id=obj.user_id).first().name
         user_dict['phone'] = models.UserModel.objects.filter(id=obj.user_id).first().phone 
     user_dict['createtime'] = models.UserModel.objects.filter(id=obj.user_id).first().createtime return user_dict
from rest_framework.response import Response
from rest_framework.views import APIView
from myuser import models, userserializer

class OrderAPIView(APIView):
    def post(self, request):
            order = model.UserModel.object.filter.all()
            order_ser = userserializer.OrderSerializer(order,many=True)
            return Response({'code': 200, 'data':order_ser.data})

看一下返回的data:

{
    "code": 200,
    "data": {
        "data": [
            {
                "id": 1,
                "user": {
                    "id": 1,
                    "name": "user_18404",
                    "phone": "1888888888",
                    "createtime": "2020"
                },
                "user_id": 1,
                "title": "芹菜",
                "price": 0.25,
                "num": 10,
                "createtime": "2020"
            }
        ]
    }
}

 

 

  

posted @ 2020-08-28 16:59  安东辉辉辉辉  阅读(487)  评论(0)    收藏  举报