Django学习记录7——Model的创建与应用

目录

零之前言

一.创建完整模型

1.创建模型框架

2.创建模型字段

①字段类型

②字段选项

③关系

④访问

二.模型的使用

1.增

2.删

3.查

①返回查询集(过滤器):

②返回单个数据:

③限制查询集:

④使用:

4.改

三.后记


零之前言

个人理解的model是django里的一种数据库的抽象。

它通过一种类的形式去对应了数据库一张表格。相当于对一张表进行了封装。

无论是你是使用哪种数据库,Django中model的代码基本上可以不需要改变,只需要修改使用的数据库类型,django可以通过migration把你的model映射为那一张表格。你也可以减少使用原生的数据库代码去操作数据库。

而且,创建模型的前提是:你需要在Django上配置好你的数据库。

一.创建完整模型

1.创建模型框架

首先进入我们的app/models.py里,载入我们的models。(芮然models.py 已经帮我们写好了)

from django.db import models

然后新建一个类,该类继承了我们django提供的模型,类名就是我们的模型名:

class Test_model(models.Model):

并且在该类下面定义一个Meta类,用于设置元信息,比如表的名字和默认排序的方式

	class Meta:
		db_table = xxx 定义数据表名,推荐使用小写字母
		ordering =['id'] 

一般我们结构如下就行了:

class Account(models.Model):

    class Meta:
        db_table = 'namedb'

2.创建模型字段

①字段类型

以下是字段类型:类似于我们的表里数据的类型

  • AutoField
    一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中
  • CharField(max_length=字符长度)
    字符串,默认的表单样式是 TextInput
  • TextField
    大文本字段,一般超过4000使用,默认的表单控件是Textarea
  • IntegerField
    整数
  • DecimalField(max_digits=None, decimal_places=None)
    使用python的Decimal实例表示的十进制浮点数。
    参数说明:DecimalField.max_digits = 位数总数;DecimalField.decimal_places = 小数点后的数字位数
  • FloatField
    用Python的float实例来表示的浮点数
  • BooleanField
    true/false 字段,此字段的默认表单控制是CheckboxInput
  • NullBooleanField
    支持null、true、false三种值
  • 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 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。
  • TimeField
    使用Python的datetime.time实例表示的时间,参数同DateField。
  • DateTimeField
    使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
  • FileField
    一个上传文件的字段
  • ImageField
    继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image

②字段选项

通过字段选项,可以实现对字段的约束。

  • null
    如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
  • blank
    如果为True,则该字段允许为空白,默认值是 False。
  • 注意:null是数据库范畴的概念,blank是表单验证证范畴的
  • db_column
    字段的名称,如果未指定,则使用属性的名称
  • db_index
    若值为 True, 则在表中会为此字段创建索引
  • default
    默认值
  • primary_key
    若为 True, 则该字段会成为模型的主键字段
  • unique
    如果为 True, 这个字段在表中必须有唯一值

③关系

  • ForeignKey:一对多,将字段定义在多的端中
  • ManyToManyField:多对多,将字段定义在两端中
  • OneToOneField:一对一,将字段定义在任意一端中

④访问

  • 用一访问多:
    对象.模型类小写_set  例如:grade.students_set
  • 用一访问一:
    对象.模型类小写  例如:grade.students
  • 访问id:
    对象.属性_id  例如student.sgrade_id

二.模型的使用

一般我们的模型都是在Views里面使用。

1.增

def welcome(request):
    a = Account() #实例化对象,并接下来赋值
    a.acc_password = 'a' 
    a.acc_password = 'b'
    a.save() #保存对象
    return HttpResponse("ok")

2.删

逻辑删除:删除一般不用物理删除,而是使用逻辑删除。比如我们可以给模型增加一个BooleanField字段,通过判断T/F来判断是否删除。

物理删除:调用delete方法即可

a.delete()

3.查

查询的方法有多重,一般是先通过过滤器来获得一个过滤集,然后再来获取,写成链式调用。

①返回查询集(过滤器):

  •   all()  返回所有数据
  •   filter()  返回符合条件的数据
  •   exclude()  过滤掉符合条件的数据
  •   order_by()  排序
  •   values()  一条数据就是一个字典,返回一个列表

②返回单个数据:

  • get():慎用!返回一个满足条件的对象     
         如果没有找到符合条件的对象,会引发 模型类.DoesNotExist异常     
         如果找到多个,会引发  模型类.MultiObjectsReturned 异常
  • first():返回查询集中的第一个对象
  • last():返回查询集中的最后一个对象
  • count():返回当前查询集中的对象个数
  • exists():判断查询集中是否有数据,如果有数据返回True没有反之

③限制查询集:

可以使用下标的方法进行限制

studentList = Student.objects.all()[0:5]    下标不能是负数

④使用:

一般我们可以通过filter()的级联来限制查询条件,然后通过exists()是否存在来判断有无数据。若是有对数据的唯一要求我们还可以通过count()来判断个数。

假设我们要做登录,我们已经确保了用户ID是唯一的了,那么我们还是通过级联filter的方式来选择存在的用户,然后将用户权限和名字写进cookies里

    users = Account.objects.filter(acc_password=uword).filter(acc_name=uname)
    if users.exists():
        res = HttpResponseRedirect(reverse("app:welcome"))
        res.set_cookie('username', uname)
        res.set_cookie('userkey', users[0].acc_permission)
        return res

4.改

改就不必赘述,查询到了修改字段的内容,然后Save()就行了

三.后记

差不多对模型的基础操作用这么多就够了,如果需要了解更多,可以更深入的了解。

发布了63 篇原创文章 · 获赞 38 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011017694/article/details/104124184