[Django] Django(三) 模型基础

Models概述

Model是Django中的模型层,用来构建和操纵Web应用的数据。
Django中使用ORM框架来操作数据库,因此不需要使用SQL语句对数据库进行操作,而是使用类和类的对象来进行数据库操作。
Django提供了model用来管理、构建应用程序的数据,model是数据单一的信息源,它包含数据库中存储的所有字段。简而言之,每个model映射一个数据库中的表。

由于Model这块主涉及到了数据库操作,django默认数据库为sqlite3,因此,先需要配置mysql数据库。
ORM技术:对象关系映射,实现了对象和数据库之间的映射,隐藏了数据访问的细节,不需要编写SQL语句,。

特点:

1.每个model都是继承于django.db.models.Model的Python类,因此需要导入该模块包:

from django.db import models

2.model中的每个属性都代表一个数据库字段

如何创建model

要创建一个model,只需在对应应用的model.py中,创建一个继承与models.Model的类,该类就代表数据库中的一张表,类中的每个属性代表数据库表中的字段:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=40)
    age = models.IntegerField(null=False)
    number = models.IntegerField(unique=True)

创建好model后,需要将该model映射成为数据库中对应的表,通过如下命令:

(.py3env) $ python manage.py makemigrations 
(.py3env) $ python manage.py migrate 

此时说明在数据库中已经创建了一张表,表名格式为:应用名_model名,如该例中应用名为person,因此会生成person.student表,通过mysql查看表结构:

mysql> desc person_student;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(40) | NO   |     | NULL    |                |
| age    | int(11)     | NO   |     | NULL    |                |
| number | int(11)     | NO   | UNI | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

掌握了最基本用法后,下面对模型中的字段进行总结。

Field 字段

Django中提供了许多定义model属性的字段,这些字段将会映射为数据库中对应的字段,也就是说,数据库表中存储的字段都是通过Model中来定义,在Model中,每个字段被定义为Model类的属性,如Student中的CharField,IntegerField…等等。

注意:字段定义不能和ModelAPI中已有的标识符重复,以免冲突;

字段类型(Field types)

Django中定义model时的每个字段类型都继承自Field类,常用的有如下几种:

  • CharField(max_length=None, **options):对应数据库中的varchar类型
  • TextField(**options):存储大文本信息,对应数据库中的longtext类型
  • IntegerField(**options):对应数据库中的int类型
  • DateTimeField():对应数据库中的datetime类型
  • FloatField():对应数据库中的double类型
  • ForeignKey():用于创建多对一关系表
  • ManyToManyField():用于创建多对多关系表
  • OneToOneField():用于创建一对多关系表
字段可选项(Field options)

每个字段中,可以传入一些成参数作为约束,常见字段选项有如下几种:

  • max_length:CharField字段中用于指定大小,如:
name = models.CharField(max_length=40) # varchar(40)
  • choices: 一个给定的二元组,如果给定该字段,则该字段在后台管理中或者Form表单中将以复选框的形式供用户选择。如:
from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
  • null:如果设置为ture,则该字段可以存储空值,默认为False
  • blank:如果设置为ture,则该字段可以存储空值,默认为False

    注意:这两者区别:null是和纯数据相关,null=True表示,该字段允许为NULL和空值”,null=False表示该字段不能为空;blank和验证相关,blank=true表示form验证时允许输入空值,blank=False表示需要一个值

  • default:字段默认存储的值

  • primary_key:如果设置为true,则该字段将会被设置为主键
    默认情况下,Django为每个Model提供了如下字段用于创建一个自增主键:
id = models.AutoField(primary_key=True)

如果在定义model时,显示提供了primary_key=True,则Django不会提供自增主键了。

  • unique:如果设置为true,该字段在表中唯一的。
  • verbose_name:提供一个易读的字段名称,如果没有提供该字段,则默认为当前定义的filed字段名,并将下划线转为空格、小写转大写,指定该字段后,可以显式在后台系统中或者form表单中,如:
nickname = models.CharField(max_length=20,verbose_name=u'昵称')
字段名(Verbose field names )

除 ForeignKey, ManyToManyField and OneToOneField三种字段类型外,Django中的每个字段类型,都可以使用第一个位置参数来指定一个详细的字段名字,如果没有指定,则默认使用该字段属性名。

关系型数据库设计

Django提供了三种关系型数据库表的设计方式:

1.多一对一关系型

如学生和班级就是多对一关系,多个学生可以对应一个班级,但多个班级不能对应一个学生,通过ForeignKey字段定义。
ForeignKey(to, on_delete, **options)参数:
to:表示关联的model,
on_delete:当ForeignKey被引用的对象删除时,Django将会根据on_delete指定的参数进行SQL约束,CASCADE表示级联删除。
**options:当on_delete=SET_NULL时指定null=True,blank=True,或用来指定其他属性
这两个model创建如下:

from django.db.models import ForeignKey

class Student(models.Model):
    classroom = models.ForeignKey('classRoom', on_delete=models.CASCADE)
    name = models.CharField(max_length=40)
    age = models.IntegerField(null=False)
    number = models.IntegerField(unique=True)
    description = models.TextField()
    time = models.DateTimeField()
    avg_score = models.FloatField(default=0.0)


class classRoom(models.Model):
    member = models.IntegerField()
    head_teacher = models.CharField(max_length=40)

创建后,在学生表中会有一个班级表id字段作为外键。

2.多对多关系型

通过 ManyToManyField字段定义,第一个参数表示关联的model。(暂时不总结)

3.一对一关系型:

通过 OneToOneField字段定义。(暂时不总结)

查询数据库

当创建好数据库后,就可以进行CRUD操作了,Django中提供了用于CRUD的API,下面通过实例,对CRUD相关API进行总结。

1.添加数据

在Django中,一个model映射到数据库中的一张表,而一个model对象则代表该表中的一条记录,现在通过Django Shell来添加数据:

$ python manage.py shell
>>> from relate.models import Student
>>> stu1 = Student(name='xiaohong',age=21,number=2014,description='good girl',time='2018-4-18',avg_score=70,classroom_id=1)
>>> stu1.save()

save()方法相当于执行insert into table ...的操作,此时数据库表中已成功插入一条数据。

2.更新数据

更新数据也是通过save()方法进行,如:

>>> stu1.name='Little.Hong'
>>> stu1.save()
>>> 

还可以用update():

>>> Student.objects.filter(number=2013).update(name='Lisi')

3.查询数据

对数据库中的数据进行查询,Django中要借助于一个类——models.Manager来进行,查询时Manager会返回一个QuerySet对象,每个model至少有一个Manager,默认的Manager为objects。

注意:manager 只能通过model类名来访问,不能通过model对象来访问,因为model对象代表的是一条记录。

QuerySet是一个表示数据库中的对象的集合。它可以有零个、一个或多个过滤器,过滤器通过给定的参数缩小查询范围,在Django中QuerySet相当于select语句。

查询所有数据:

在Manager中,all()方法会返回当前数据库中所有对象的QuerySet,如:

>>> Student.objects.all()
<QuerySet [<Student: Student object (4)>, <Student: Student object (5)>]>
>>> 

相当于select * from student;

条件查询

在QuerySet中提供了两个方法用于进行条件查询:

  • filter(**kwargs):返回一个包含给定查找参数对象的新QuerySet。
  • exclude(**kwargs):返回一个不包含给定查找参数对象的新QuerySet。

如查找学号为2014的学生:

>>> Student.objects.all().filter(number=2014)
<QuerySet [<Student: Student object (5)>]>
>>> 

或者

>>> Student.objects.filter(number=2014)
<QuerySet [<Student: Student object (5)>]>
>>> 
链式查询:
>>> Student.objects.filter(
... name='Little.Hong'
... ).exclude(
... age=23)
<QuerySet [<Student: Student object (5)>]>
>>> 

或者可以将每次得到的QuerySet赋给变量进行存储,之后可以进行复用:

>>> q1 = Student.objects.filter(name='Little.Hong')
>>> q2 = q1.exclude(age=32)
>>> q3 = q2.filter(number=2012)
>>> q1
<QuerySet [<Student: Student object (5)>]>
>>> q2
<QuerySet [<Student: Student object (5)>]>
>>> q3
<QuerySet []>
>>> 
查询单一对象:

通过objects、fillter等从数据库中查到了QuerySet对象,如果要获取单一对象,需要使用objects.get()方法,如:

>>> Student.objects.get(pk=5)
<Student: Student object (5)>

django在同步models时候会自动为每个表创建1个id字段==pk字段。

4.删除数据

删除数据时,使用delete()方法,这个方法是QuerySet的方法,不是Manager的,因此使用时需要注意。如:

>>> Student.objects.filter(name='Little.Hong').delete()
(1, {'relate.Student': 1})

返回删除对象的个数和每个对象删除次数的字典。
也可以通过Model.delete()来删除:

>>> Student.objects.get(name='xiaowang').delete()
(1, {'relate.Student': 1})

注意:QuerySet.delete()仅仅是执行SQL语句,并不会执行Model.delete()

猜你喜欢

转载自blog.csdn.net/fightfightfight/article/details/79998929
今日推荐