lxinghua

博客园 首页 新随笔 联系 订阅 管理
  117 随笔 :: 0 文章 :: 0 评论 :: 7553 阅读

每个django模型类都有一个默认的管理器,objects

常用的查询

常用的查询方法:

Student皆为数据库名称

1. 获取所有记录all:res = Student.objects.all()

2. 查询单条get:res = Students.objects.get(name='liuxinghua')

    注意:get返回的对象具有唯一性质,如果符合条件的对象有多个,则get报错!

3. 条件查询filter与排除查询exclude

 filter:res = Student.objects.filter(name='liuxinghua')    获取条件记录

 注意:filter(**kwargs)方法:根据参数提供的提取条件,获取一个过滤后的QuerySet

 exclude:res = Student.objects.exclude(name='liuxinghua')   获取条件外记录

4. 获取第一条数据first:res = Student.object.first()

    获取最后一条数据:res = Student.objects.last()

5. 制定字段查询:

 values:提升查询效率,仅能拿到制定字段的值,其他字段值无法获取;

 res = Student.objects.values('id', 'name', 'age')     仅能获取id、name、age数据

 only:提升查询效率,能拿到制定字段的值,其他字段值也能获取,主键必带

 res = Student.objects.only('id', 'name', 'age') 

 defer:排除制定字段,进行查询,主键必带,作用与only相反

 res = Student.objects.defer('id', 'name', 'age') 

6. 排序order by

 单项排序:res = Student.objects.order_by('age')

 多项排序:res = Student.objects.order_by('age', 'id')

 逆向排序:res = Student.objects.ordeer_by('-age')

7. 切片,不支持负索引,数据量大时不要使用步长   res[:3]  0,1,2项目

8. 多条件查询

 and查询:res = Student.objects.filter(age=18, sex=1)

 or查询:

 from django.db.models import Q

 res = Student.objects.filter(Q(age=18), Q(sex=1)|Q(age=20))

9. 将返回来的QuerySet中的Model转换为字典:res = Student.objects.all().values()

若仅需要QuerySet中的默写字段:res = Student.objects.values('id', 'name', 'age')

10. 获取当前查询到的数据的总数:res = Student.objects.count()

常用的查询条件

1. 包含查询:

 res = Student.objects.filter(name__contains='Lu')    # 查询name中包含‘Lu’的数据记录

 res = Student.objects.filter(name__icontains='Lu')    # 查询name中包含‘lu’的数据记录,忽略大小写

2. 范围查询:

 大于:res = Student.objects.filte(age__gt=12)     # 查询age大于12的数据记录

......

常用的模型字段类型

Field的常用参数

官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#verbose-name

表关系的实现

1. 一对一关系性表格

views.py文件更新代码

在一对一情况下,关联字段两边都可以摆放,存在以下两种情况:

a. 一对一情况下,在StudentDetail表信息删除时,Student中的信息还存在意义,故在Student类定义中采用on_delete=models.SET_NULL设定

detail = models.OneToOneField('StudentDetail', on_delete=models.SET_NULL, null=True)   # models.SET_NULL代表的是关联表数据删除后,把对应的字段设置为null

b. 一对一情况下,在Student表出现数据删除时,StudentDetail表信息则无意义了,故在StudentDetail类定义中采用on_delete=models.CASCADE

student = models.OneToOneField('Student', on_delete=models.CASCADE), # on_delete=models.CASCADE代表的是关联表数据删除后,把对应的字段也删除

复制代码
from django.db import models


class Student(models.Model):  # student模型是models.Model的子类
    name = models.CharField(verbose_name='学生姓名', max_length=20)
    age = models.SmallIntegerField(verbose_name='学生年龄', null=True)
    sex = models.SmallIntegerField(default=1, verbose_name='学生性别')  # 设置默认值
    qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码')
    phone = models.CharField(max_length=20, null=True, verbose_name='电话号码')
    c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add=True自动填充当前时间
    # detail = models.OneToOneField('StudentDetail', on_delete=models.SET_NULL, null=True)  # models.SET_NULL代表的是关联表数据删除后,把对应的字段设置为null

    class Meta:
        db_table = 'student'  # 对模型进行重命名

    def __str__(self):
        return self.name


class StudentDetail(models.Model):
    address = models.CharField(max_length=20, default='', verbose_name='地址')
    student = models.OneToOneField('Student', on_delete=models.CASCADE)

    class Meta:
        db_table = 'detail'

    def __str__(self):
        return self.address
复制代码

 

2. 一对多关系性表格

一对多情况下,关联字段需要放在多表中,而在关联数据被删除后,对应字段还存在意义,故需要把该字段的关联数据设置为null,故采用models.SET_NULL

grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)

复制代码
from django.db import models


class Student(models.Model):  # student模型是models.Model的子类
    name = models.CharField(verbose_name='学生姓名', max_length=20)
    age = models.SmallIntegerField(verbose_name='学生年龄', null=True)
    sex = models.SmallIntegerField(default=1, verbose_name='学生性别')  # 设置默认值
    qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码')
    phone = models.CharField(max_length=20, null=True, verbose_name='电话号码')
    c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add=True自动填充当前时间
    grade = models.ForeignKey('Grade', on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'student'  # 对模型进行重命名

    def __str__(self):
        return self.name


class Grade(models.Model):
    name = models.CharField('班级名称', max_length=20)
    num = models.CharField('班期', max_length=20)

    class Meta:
        db_table = 'grade'
复制代码

 

3. 多对多关系性表格

复制代码
from django.db import models


class Student(models.Model):  # student模型是models.Model的子类
    name = models.CharField(verbose_name='学生姓名', max_length=20)
    age = models.SmallIntegerField(verbose_name='学生年龄', null=True)
    sex = models.SmallIntegerField(default=1, verbose_name='学生性别')  # 设置默认值
    qq = models.CharField(max_length=20, null=True, verbose_name='QQ号码')
    phone = models.CharField(max_length=20, null=True, verbose_name='电话号码')
    c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add=True自动填充当前时间

    class Meta:
        db_table = 'student'  # 对模型进行重命名

    def __str__(self):
        return self.name


class Course(models.Model):
    name = models.CharField('课程名称', max_length=20)
    students = models.ManyToManyField('Student')

    class Meta:
        db_table = 'Course'
复制代码

Tools>Run manage.py Task进入manage.py@CRM界面

执行模型更改的生成迁移文件并让迁移文件生效

makemigrations

migrate

在多对多表格关联后其会自动生成中间关联表格。

 

迁移命名总结:

1. 运行命令python manage.py makemigrations teacher     创建迁移

2. 运行命令python manage.py sqlmigrate 迁移序号    查看迁移sql语句

3. 运行命令python manage.py migrate teacher 迁移序号   回滚回指定迁移

4. 运行命令python manage.py migrate    应用这些迁移

 

posted on   興華  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示