1. 程式人生 > 實用技巧 >Django ORM 非關聯關係序列化反向查詢

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"
            }
        ]
    }
}