美文网首页
Python(五十一)常用查询及表关系的实现

Python(五十一)常用查询及表关系的实现

作者: Lonelyroots | 来源:发表于2022-01-26 21:55 被阅读0次

    从2021年9月2日发文至今,Python系列(包括代码在内)共计94343个字、五十一篇!

    1. 常用的查询

    查找对象的条件的意思是传给以下方法的一些参数。相当于是SQL语句中的where语句后面的条件,语法为字段名__规则(是连着连个下划线哦)

    models_test/views.py:

    # (七、常用查询及表关系的实现:数据的增删改查)
    from django.http import HttpResponse
    from .models import User,FieldTest        # 导入.models这个文件目录下的User和FieldTest模型类
    
    
    # 添加数据
    def add_user(request):
    
        # # 方法一,类的实例化赋值。
        # zf = User(name='追风',age=20)
        # zf.save()       # 保存数据
        # return HttpResponse('添加成功!')
    
        # # 方法二,类的实例化赋值。
        # chen = User()
        # chen.name = '晨'
        # chen.age = 21
        # chen.save()
        # return HttpResponse('添加成功!')
    
        # # 方法三,使用create方法直接创建对象,作为数据表的记录。
        # User.objects.create(name='摸鱼',age=80)
        # return HttpResponse('添加成功!')
    
        # # 前三个方法都会重复添加,第四个方法不会。
        # # 方法四,使用get_or_create方法可以防止添加重复的顺序
        # User.objects.get_or_create(name='chenhong', age='21')
        # User.objects.get_or_create(name='leishen', age='21')
        # User.objects.get_or_create(name='mieba', age='30')
        # User.objects.get_or_create(name='peiqi', age='21')
        # User.objects.get_or_create(name='moran', age='21')
        # return HttpResponse('添加成功!')
    
        # 往FieldTest表中插入数据
        FieldTest.objects.get_or_create(name='胡桃',age=16)
        FieldTest.objects.get_or_create(name='杨桃',age=18)
        return HttpResponse('添加成功!')
    
    
    # 查询数据
    def select_user(request):
    
        # # 查询所有数据
        # res = User.objects.all()  # all查询所有数据
        # for i in res:
        #     print(i)        # 这里重写了str方法,具体可看Python(十三)面向对象高级里的输出魔术方法。
        # print(res[0])
        # print(res[2:4])
        # f = User.objects.first()        # 获取第一条数据
        # l = User.objects.last()         # 获取最后一条数据
        # print(f,l)
        # return HttpResponse('查询成功!')
    
        # # 条件查询:
        # res = User.objects.filter(name='追风')        # filter查询到多少数据,就得到多少数据。
        # res = User.objects.get(id=4)        # get只能用于唯一值的查询,不能同时查询多条数据。
        # res = User.objects.filter(name__contains='风')       # 查询名字里包含风的记录。
        # res = User.objects.filter(name__in=['追风','晨','摸鱼'])     # 成员运算符,查询包含这三个成员的记录。
        # res = User.objects.filter(name__startswith='m')     # 查询以m为开头的记录。
        # res = User.objects.filter(name__endswith='n')     # 查询以n为结尾的记录。
        # res = User.objects.exclude(age=18)     # 查询除年龄为18以外的记录。
        # res = User.objects.order_by('age')     # 按年龄大小,从小到大正向排序记录。
        # res = User.objects.order_by('-age')     # 按年龄大小,从大到小反向排序记录。
        # res = User.objects.order_by('age','id')     # 按年龄大小,从小到大正向排序记录,若age一样,则以id从小到大排序。
        # print(res)
        # return HttpResponse('条件查询成功!')
    
        # # 范围查询
        # res = User.objects.filter(age__lt=22)       # 查询小于22岁的记录
        # res = User.objects.filter(age__gt=22)       # 查询大于22岁的记录
        # res = User.objects.filter(age__range=(16,30))       # 查询大于等于16,小于等于30岁的记录,左右都是闭区间
        # res = User.objects.count()       # 查询数据总数
        # res = User.objects.all().values()       # 查询将返回来的QuerySet中的Model转换为字典。
        # print(res)
        # return HttpResponse('范围查询成功!')
    
        # 向FieldTest表中查询数据
        res = FieldTest.objects.all().values()
        print(res)
        return HttpResponse('查询成功')
    
    
    # 修改数据
    def update_user(request):
    
        # # 方法一:
        # res = User.objects.get(id=1)
        # res.age = 21
        # res.save()
        # return HttpResponse('修改成功!')
    
        # # 方法二
        # # 这种方式修改只能用filter,因为get没有update方法
        # User.objects.filter(name='摸鱼').update(age=70)
        # return HttpResponse('修改成功!')
    
    
        # 修改FieldTest表中的数据
        # 这个方法修改不会去更新修改时间
        # FieldTest.objects.filter(id=1).update(sex=0,introduction='胡桃是往生堂的店主')
        # return HttpResponse('修改成功!')
    
        # 这个方法修改会去更新修改时间
        res = FieldTest.objects.get(id=1)
        res.introduction = '胡桃是火系之神'
        res.save()
        return HttpResponse('修改成功!')
    
    # 删除数据
    def delete_user(request):
    
        # # 删除部分数据,get和filter都有delete方法。
        # User.objects.get(id=2).delete()
        # User.objects.filter(id=2).delete()
        # return HttpResponse('删除成功!')
    
        # 删除全部数据。
        User.objects.all().delete()
        return HttpResponse('删除成功!')
    

    models_test/urls.py:

    # (六、模型基础;七、常用查询及表关系的实现)
    from django.urls import path
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('add/',views.add_user),
        path('select/',views.select_user),
        path('update/',views.update_user),
        path('delete/',views.delete_user),
    ]
    

    2. 常用的模型字段类型

    1. IntegerField : 整型,映射到数据库中的int类型。
    2. CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
    3. TextField: 文本类型,映射到数据库中的text类型。
    4. BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
    5. DateField: 日期类型,没有时间。映射到数据库中是date类型,
      在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。
    6. DateTimeField: 日期时间类型。映射到数据库中的是datetime类型,在使用的时候,传递datetime.datetime()进去。

    models_test/models.py:

    # (七、常用查询及表关系的实现:2、常用的模型字段类型)
    from django.db import models
    
    class FieldTest(models.Model):
        id = models.AutoField(primary_key=True)     # 主键约束
        name = models.CharField(max_length=20,unique=True)     # 最大长度为20,唯一约束
        age = models.IntegerField()     # 默认null为False,非空约束
        sex = models.BooleanField(default=True)     # 默认约束,在数据库里查看表时默认值不会显示出来,并不影响表的使用
        introduction = models.TextField(null=True)     # 对应长文本类型,允许为空
        create_time = models.DateField(auto_now_add=True)        # 自动记录当前数据的创建时间
        update_time = models.DateTimeField(auto_now=True)       # 自动记录当前数据更新时间
    

    3. Field的常用参数

    1.primary_key: 指定是否为主键。
    2.unique: 指定是否唯一。
    3.null: 指定是否为空,默认为False。
    4.blank:等于True时form表单验证时可以为空,默认为False。
    5.default: 设置默认值。
    6.DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用QuerySet.update方法才不会调用。这个参数是Date和DateTime以及TimModel.save()方法调用某类时才有的。
    7.DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值。

    models_test/models.py:

    # (七、常用查询及表关系的实现:2、常用的模型字段类型)
    from django.db import models
    
    class FieldTest(models.Model):
        id = models.AutoField(primary_key=True)     # 主键约束
        name = models.CharField(max_length=20,unique=True)     # 最大长度为20,唯一约束
        age = models.IntegerField()     # 默认null为False,非空约束
        sex = models.BooleanField(default=True)     # 默认约束,在数据库里查看表时默认值不会显示出来,并不影响表的使用
        introduction = models.TextField(null=True)     # 对应长文本类型,允许为空
        create_time = models.DateField(auto_now_add=True)        # 自动记录当前数据的创建时间
        update_time = models.DateTimeField(auto_now=True)       # 自动记录当前数据更新时间
    

    4. 表关系的实现

    image

    外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错!
    一般使用CASCADE表示级联删除。
    执行完makemigrations db_test和migrate db_test的命令后,在数据库我们能看到5张表,其中多对多关系的ManyToManyField方法自动生成了关系表。

    db_test/models.py:

    # (七、常用查询及表关系的实现:4、表关系的实现)
    
    from django.db import models
    
    # Create your models here.
    # 学院表
    class Department(models.Model):
    
        d_id = models.AutoField(primary_key=True)
        d_name = models.CharField(max_length=30,unique=True)
    
        def __str__(self):
            return f'd_id={self.d_id},d_name={self.d_name}'
    
    # 学生表
    class Student(models.Model):
    
        s_id = models.AutoField(primary_key=True)
        s_name = models.CharField(max_length=30)
        # 一对多关系,当删除学院时,隶属于该学院的学生对应学院的id号为null
        dept_id = models.ForeignKey('Department',on_delete=models.SET_NULL,null=True)       # 外键在数据库中显示会自动添加_id
    
        def __str__(self):
            return f's_id={self.s_id},s_name={self.s_name},dept_id={self.dept_id}'
    
    # 学生详情表
    class StuDetail(models.Model):
    
        stu_id = models.AutoField(primary_key=True)
        stu_age = models.IntegerField()
        stu_sex = models.BooleanField(default=1)
        intro = models.TextField(null=True)
        # 一对一关系,在删除学生的同时,删除该学生的详情
        s_id = models.OneToOneField('Student',on_delete=models.CASCADE)
    
        def __str__(self):
            return f'stu_id={self.stu_id},stu_age={self.stu_age},stu_sex={self.stu_sex},intro={self.intro}'
    
    # 课程表
    class Course(models.Model):
    
        c_id = models.AutoField(primary_key=True)
        c_name = models.CharField(max_length=30,unique=True)
        # 多对多关系,关系创建成功,中间表自动生成。
        stu_course = models.ManyToManyField('Student')
    
        def __str__(self):
            return f'c_id={self.c_id},c_name={self.c_name}'
    

    文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

    Editor:Lonelyroots

    相关文章

      网友评论

          本文标题:Python(五十一)常用查询及表关系的实现

          本文链接:https://www.haomeiwen.com/subject/wehohrtx.html