Django ORM 非关联关系序列化反向查询
当看到物理外键的时候,第一反应是有物理外键那一定有逻辑外键,那我熟悉的外键是什么?
物理外键指的是使用foreign key 作为外键关联另一张的字段的连接方法,而且限定了引擎为InnoDB,而逻辑外键,又叫做事实外键,是因为存在语法上的逻辑关联而产生的外键,需要有连接关键词inner join 或者left join 等等和连接部分,也就是on后面的部分,如果需要对应的设置,也可以加上set等语句。
为何说所有物理外键删除,因为外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况
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" } ] } }

浙公网安备 33010602011771号