lxinghua

博客园 首页 新随笔 联系 订阅 管理

每个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 2022-11-04 10:45  興華  阅读(54)  评论(0编辑  收藏  举报