Django ORM - 001 - 外鍵表查詢主表信息


開始用Django做web開發,我想大家都會遇到同樣的問題,那就是如何高效快速的查詢需要的數據,MVC都很簡單,但是ORM折騰起來就有些費時間,我准備好好研究下Django ORM,所以會有一個系列的Blog,歡迎大家討論拍磚。

 

1. 如何快速的通過外鍵表獲取主表的信息

演示Class

from django.db import models
import uuid

class Employee(models.Model):
    employee_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)    
    user_name = models.CharField(max_length=30)
    pwd = models.CharField(max_length=50)
    
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    entry_date = models.DateTimeField(auto_now=True, editable=False)

    def __str__(self):
        return self.user_name
from django.db import models
from datetime import datetime
from .Employee import Employee
class EmployeeIP(models.Model):
    IP = models.GenericIPAddressField(
        protocol='IPv4', unpack_ipv4=False, max_length=30, unique=True, primary_key=True)
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)

    def __str__(self):
        return self.IP

主要用到Django的 select_related(), 它的作用是實現主外鍵表的關聯查詢,一次數據庫查詢拿到的QuerySet中包含主表的model實例數據,再加上一個生成表達式提取需要的信息,兩行代碼拿到所有數據,后面注釋的是返回的JSON數據

from django.http import JsonResponse
def ip_json(request):
    employee = Employee.objects.get(user_name='admin')

    ip_list2 = EmployeeIP.objects.filter(employee_id=employee.employee_id).select_related()
    ip_list3 = [{"ip": x.IP, "name": x.employee.first_name + ' ' + x.employee.last_name} for x in ip_list2]
return JsonResponse(ip_list3, safe=False) ''' [{ "name": "Tom", "ip": "192.168.1.110" }, { "name": "Jim", "ip": "192.168.1.111" }, { "name": "Lucy", "ip": "192.168.1.112" }] '''

 

select_related() 還支持指定深度,如果你的表格之間有多層外鍵應用的話最好指定,否則查詢的將是一個非常大的數據集。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM