Django的模型(一):DML、Django Shell、数据级联、元信息、字段类型及约束、模型过滤

一.DML

1.迁移

(1)迁移默认的13张表
在我们配置好上面的环境时,运行会出现以下红色显示:
在这里插入图片描述
这是为了提醒我们django中已经默认有13张表,我们需要将其迁移,可以直接使用:python manage.py migrate
在这里插入图片描述
(2)自定义模型的迁移
如果我们要迁移自定义模型,先要生成迁移文件: python manage.py makemigrations,再执行迁移文件: python manage.py migrate
在models中自定义模型:

class Heros(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()

在云服务器中输入命令:
在这里插入图片描述

运行结果:
在这里插入图片描述

注意:

  1. 如果模型想被迁移,那么模型所在的App,必须要在settings的INSTALLED_APPS中加载。
  2. django的模型必须继承 models.Model
  3. 在django中自动定义模型会自动生成主键
  4. 字符串的长度必须指定

2.模型对象的添加

在django中添加模型对象是非常简单与人性化的
在子路由中添加add路径:

url(r'^add/', views.add)

在视图函数中:

def add(request):
    hero=Heros()
    hero.name='亚索'
    hero.age=18

    hero.save()

    return HttpResponse('添加成功')

运行结果:
在这里插入图片描述

3.模型对象的查询

django的查询是:模型.objects.get/all
现有如下表:
在这里插入图片描述

查询单个数据:
在子路由中添加find路径:

url(r'^find/', views.find)

在视图函数中:

def find(request):
    a = Heros.objects.get(pk=1)
    print(a.name,a.age)
    return HttpResponse('查询')

运行结果:
在这里插入图片描述

查询所有的数据:

def find(request):
    a_list = Heros.objects.all()
    print(type(a_list))
    for a in a_list:
        print(a.name,a.age)
    return HttpResponse('查询')

运行结果:
在这里插入图片描述

4.模型对象的删除

在子路由中添加delete路径:

url(r'^delete/', views.delete)

在视图函数中:

def delete(request):
    # 删除也要基于查询
    hero = Heros.objects.get(pk=4)
    hero.delete()
    return HttpResponse('删除')

运行结果:
在这里插入图片描述

5.模型对象的修改

在子路由中添加update路径:

url(r'^update/', views.update)

在视图函数中:

def update(request):
    hero=Heros.objects.get(pk=2)
    hero.name='锤石'
    hero.save()
    return HttpResponse('修改')

运行结果:
在这里插入图片描述

二.Django Shell

使用:django 终端,
命令:python manager.py shell
作用:集成了django环境的python终端,通常用来调试

三.数据级联

1.一对多模型的创建

这里以班级(Grade)和学生(Student)为例。
在models中创建模型:

class Grade(models.Model):
    name = models.CharField(max_length=32)

class Student(models.Model):
    name = models.CharField(max_length=32)
    #外键
    s_grade = models.ForeignKey(Grade)

生成迁移文件并执行:
在这里插入图片描述
运行结果:
在这里插入图片描述

注意:

  1. 如果2张表有关联关系,那么带主键的表是主表,带外键的表是从表
  2. django中自动生成主键,不需要手动设置
  3. 外键就是从表的某一个字段,去关联主表的主键

2.一对多查询

(1)根据主表对象查询从表数据

现有如下表:
Two_grade:
在这里插入图片描述

Two_student:
在这里插入图片描述

案例:给一个班级的名字,查询该班级的所有学生。
添加子路由:

url(r'^getStudents/',views.getStudents),

在视图函数中:

def getStudents(request):
    grade = Grade.objects.get(pk=1)
    student_list = grade.student_set
    for student in student_list.all():
        print(student.id, student.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

注意:

  1. 如果是一对多,那么一方是主表,django可以使用一方的对象调用多方模型的小写_set,就可以获取多方所有的数据。
  2. student表里的对象不能重复,因为id永远不能重复
  3. student_set的含义:(1)多个值(2)多个值也不会重复
  4. 思考:Grade这个类的对象没有student_set的属性,那为什么可以调用?
     答:如果2张表有主从关系而且还是一对多,那么主表对象有一个属性就是从表模型的小写_set,那么这个属性称为隐性属性。

(2)根据从表对象查询主表数据

案例:给一个学生的名字,查询是哪一个班级的的。
添加子路由:

url(r'^getGrade/',views.getGrade),

在视图函数中:

def getGrade(request):
    student = Student.objects.get(pk=4)
    name = student.s_grade.name
    print(name)
    return HttpResponse('查询成功'))

运行结果:
在这里插入图片描述

四.元信息

平时我们创建模型时,django自动给我们创建表名:App名_模型名
如何自己创建表名?
  class Meta:指定表名和字段名字
     db_table = ‘表名’
创建Dog模型:

class Dog(models.Model):
    name = models.CharField(max_length=32)
    # 元信息
    class Meta:
        db_table = 'dog'

生成并执行迁移文件
运行结果:
在这里插入图片描述

五.字段属性的定义及约束

1.概括

(1)django根据属性的类型确定以下信息:
     当前选择的数据库支持字段的类型
     渲染管理表单时使用的默认html控件
      在管理站点最低限度的验证

(2)django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列

(3)属性命名限制:
       遵循标识符规则
      由于django的查询方式,不允许使用连续的下划线

2.库

定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
使用方式:
    导入from django.db import models
    通过models.Field创建字段类型的对象,赋值给属性

3.逻辑删除

对于重要数据都做逻辑删除,不做物理删除
实现方法是定义isDelete属性,类型为BooleanField,默认值为False

4.字段类型

(1)AutoField
     一个根据实际ID自动增长的IntegerField,
     通常不指定,如果不指定,一个主键字段将自动添加到模型中

(2)CharField(max_length=字符长度)
     字符串,默认的表单样式是 TextInput

(3)TextField
     大文本字段,一般超过4000使用,默认的表单控件是Textarea

(4)IntegerField
     整数

(5)DecimalField(max_digits=None, decimal_places=None)
     使用python的Decimal实例表示的十进制浮点数
     参数说明:
         DecimalField.max_digits
            位数总数
         DecimalField.decimal_places
           小数点后的数字位数

(6)FloatField
     用Python的float实例来表示的浮点数

(7)BooleanField
     true/false 字段,此字段的默认表单控制是CheckboxInput

(8)NullBooleanField
     支持null、true、false三种值

(9)DateField([auto_now=False, auto_now_add=False])
     使用Python的datetime.date实例表示的日期
     参数说明:
       DateField.auto_now
         每次保存对象时,自动设置该字段为当前时间,
         用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
       DateField.auto_now_add
         当对象第一次被创建时自动设置当前时间,
         用于创建的时间戳,它总是使用当前日期,默认为false
     说明:
       该字段默认对应的表单控件是一个TextInput.
       在管理员站点添加了一个JavaScript写的日历控件,
       和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
     注意:
       auto_now_add, auto_now, and default 这些设置是相互排斥的,
       他们之间的任何组合将会发生错误的结果

(10)TimeField
     使用Python的datetime.time实例表示的时间,参数同DateField

(11)DateTimeField
     使用Python的datetime.datetime实例表示的日期和时间,参数同DateField

(12)FileField
     一个上传文件的字段

(13)ImageField
     继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

5.字段选项

通过字段选项,可以实现对字段的约束,在字段对象时通过关键字参数指定
(1)null
    如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False

(2)blank
    如果为True,则该字段允许为空白,默认值是 False

	注意
		null是数据库范畴的概念,blank是表单验证证范畴的

(3)db_column
    字段的名称,如果未指定,则使用属性的名称

(4)db_index
    若值为 True, 则在表中会为此字段创建索引

(5)default
    默认值

(6)primary_key
    若为 True, 则该字段会成为模型的主键字段

(7)unique
    如果为 True, 这个字段在表中必须有唯一值

6.关系

(1)分类
     ForeignKey:一对多,将字段定义在多的端中
     ManyToManyField:多对多,将字段定义在两端中
     OneToOneField:一对一,将字段定义在任意一端中

(2)用一访问多
     格式:
       对象.模型类小写_set
     示例:
       grade.students_set

(3)用一访问一
     格式:
       对象.模型类小写
     示例:
       grade.students

(4)访问id
     格式:
       对象.属性_id
     示例:
       student.sgrade_id

六.模型过滤

1.概括

Django默认通过模型的objects对象实现模型数据查询。
Django有两种过滤器用于筛选记录:
   filter: 返回符合筛选条件的数据集
   exclude :返回不符合筛选条件的数据集(基本不用)
   filter和exclude方法返回的都是一个queryset

2.链式调用

在子路由中添加:

url(r'^testFilter/',views.testFilter),

创建Game模型:

class Game(models.Model):
    name = models.CharField(max_length=32)
    class Meta:
        db_table = 'game'

创建如下表:
在这里插入图片描述

在视图函数中:
需求:查询id为3的游戏名

def testFilter(request):
    game_list = Game.objects.filter(id=3)
  
    for game in game_list:
        print(game.id, game.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

需求:查询id大于3的游戏名

def testFilter(request):
    game_list = Game.objects.filter(id__gt=3)
  
    for game in game_list:
        print(game.id, game.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

需求:查询id大于等于3的游戏名

def testFilter(request):
    game_list = Game.objects.filter(id__gte=3)
  
    for game in game_list:
        print(game.id, game.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

需求:查询id不为3的游戏名

def testFilter(request):
    game_list = Game.objects.exclude(id=3)
  
    for game in game_list:
        print(game.id, game.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

需求:查询id为4的游戏名(要运用filter和exclude)

def testFilter(request):
    game_list = Game.objects.exclude(id=3).filter(id__gt=3)
  
    for game in game_list:
        print(game.id, game.name)
    return HttpResponse('查询成功')

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值