zoukankan      html  css  js  c++  java
  • Django ORM

    开始用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() 还支持指定深度,如果你的表格之间有多层外键应用的话最好指定,否则查询的将是一个非常大的数据集。

  • 相关阅读:
    C#根据长度创建数组
    PLC读取数据高低位交换,批量保存到list集合,方便调用。
    C#读取图片流保存到文件,再读取流文件,把图片再显示出来
    C#从SQL server数据库中读取l图片和存入图片[转]
    C# 数据库查询表字段,写入到combox
    C# MSSQL数据库查询SQL语句拼接
    C# winform只允许程序运行一个
    C# 定时关机代码
    C#用委托来动态显示日期和时间
    使用margin负值实现压住相邻边距
  • 原文地址:https://www.cnblogs.com/wancy86/p/Django_join.html
Copyright © 2011-2022 走看看