美文网首页
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(五十一)常用查询及表关系的实现

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

  • Diango常用查询及表关系实现

    常用的查询方法: 常用查询条件: varchar>>>>>>>>>>>>>>CharFieldlongtext ...

  • MongoDB 常用查询操作

    MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解。 在阅读...

  • 内外连接 2018-05-04

    什么是连接查询: 根据两个表或多个表的列之间的关系,从这些表中查询数据。 目的:实现多个表查询操作。 语句: FR...

  • 7.常用查询以及表关系的实现

    常用的模型字段类型https://docs.djangoproject.com/en/2.1/ref/models...

  • MongoDB基础语法

    MongoDB为非关系型数据库,无法联表查询,但可以通过shell代码实现 工具:Robo 3T 以下为常用的语法...

  • django ORM 查询关系

    模型关系: 1.查询python这本书籍的出版社的邮箱 反向查询按 表名小写_set.all() 3.查询...

  • oracle 常用指令

    oracle常用指令 表空间查询 查询表空间中对象的详细信息 重建索引 创建表空间 查询表文件是否自动扩展 优化表...

  • SQLAlchemy(二)

    知识要点 常用过滤方法 Column类常用参数 sqlalchemy常用数据类型 表关系的实现 常用过滤方法 fi...

  • Clickhouse Sql汇总

    常用函数引用链接 查询表大小

网友评论

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

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