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

时间: 2024-10-10 23:57:01

Django ORM - 001 - 外键表查询主表信息的相关文章

django ORM的外键操作

外键约束示例 #models操作如下 class HostInfo(models.Model): servername = models.CharField(max_length=32) serverip = models.CharField(max_length=32) serverpassword = models.CharField(max_length=64) server_group = models.ForeignKey("GroupInfo",to_field="

主键和外键约束(主表与从表)

通过上一篇随笔,笔者了解到,实体完整性是通过主键约束实现的,而参照完整性是通过外键约束实现的,两者都是为了保证数据的完整性和一致性. 主键约束比较好理解,就是主键值不能为空且不重复,已经强调好多次,所以这里重点记录对外键约束的学习. 主表与从表 若同一个数据库中,B表的外键与A表的主键相对应,则A表为主表,B表为从表. 假设学生表(学号,姓名,性别,专业号),专业表(专业号,专业名称),则学生表中的专业号为学生表的外键,其与专业表中"专业号"属性相关联,因此,专业表为主表,学生表为从表

存在外键关联的主表truncate如何做

主外键是数据库提供的一种两表之间强制关联的方法,也可以从应用层实现. 优点 缺点 数据库实现的主外键 由数据库层机制保证,无需应用额外实现 强关联,不易扩展变更 应用实现的主外键 易扩展变更 完全由应用控制,要求较高 我认为需要根据实际情况进行取舍,例如表不复杂,可以由应用实现,若表之间关联较多且复杂,那么交由数据库处理,至少保证不会错. 存在主外键关联的主表,由于存在外键关联关系,因此有些操作就会禁止,例如truncate. 实验 1. 创建测试表 SQL> create table tbl_

主外键 子查询

主键.外键和子查询 1 主键和外键的区别 1.1定义主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空 1.2作用 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 1.3个数: 主键--主键只能有一个 外键--一个表可以有多个外键 2 主键语句code int PRIMARY KEY IDENTITY(1,1), --PRIMARY KEY 标识主键--IDENTITY(1,1) 从一开始,每增加一行加一:插入数据不用

获取用户的主外键表关系

select A.OWNER "用户名称", c.TABLE_NAME "主键表",d.COLUMN_NAME "主键字段",B.R_CONSTRAINT_NAME "主键约束",a.TABLE_NAME "外键表",a.COLUMN_NAME "外键字段",A.constraint_name "外键约束"from user_cons_columns a,user_c

django admin编辑被外键关联的主表时支持显示字表记录

假设有模型 class A(models.Model): name = models.CharField() class B(models.Model): name = models.CharField() a = models.ForeignKey(A) 如果想要在django admin 后台编辑A表记录时,能同时关联相应的B表记录, class BAdmin(admin.ModelAdmin): list_display = ['a__name', ] class BInline(admi

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结构已经整体固定下来,并且有外键关联到了这个自定义的的主键,整个后台视图逻辑也已经封装完成,如果主表的主键发生改变,那么外键所在的表就会默认关联到新的主键上,那个后台视图的改动就会非常麻烦,这时就需要使用外键字段中的to_field属性来指定所关联的主表的某个字段,而不会影响到原先的逻辑 demo如下

Django ORM queryset object 解释(子查询和join连表查询的结果)

#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) ---> <class 'django.db.models.query.QuerySet'> 查询出来是一个对象QuerySey 取值 print(books.values()) books = models.UserInfo.objects.filter()print(type(books))

Django框架(模型层:单表查询)

创建表 1.创建模型 创建名为book的app,在book下的models.py中创建模型 from django.db import models # Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) pub_data = models.DateField() price = model