您的位置:首页 > 编程语言 > Go语言

Django中的ORM(对象关系映射)

2014-10-25 14:12 225 查看
Django与数据库的命令交互主要是通过manage.py,常用的命令就是manage.py syncdb,可以将model中不在数据库中存在的表给创建完成,但是只能创建新的数据表或者列,如果model中将某个已经创建的数据表删除,syncdb是不会进行同步删除的操作的。

为什么要使用ORM:ORM是直接将sql查询语句封装为django类,这样不仅可以方便我们写代码(不用一行一行敲sql命令),提高代码的易读性(从类,类的属性,属性的参数就可以知道数据库里面有什么表,表里面有哪些列,这些列分别又有什么限制),还可以提高代码的安全性(将数据库具体相关的部分都交给django了,降低了被sql注入的风险)以及可移植性(不论mysql,postgresql程序员做的工作都少多了)。

django中的model 有几个常用的属性:

1.CharField 和TextField 都是比较常用的属性;CharFiled 是定长的,而TextField是可以无限长的。

2.除了两个常用的属性,还有一些加了验证的Field,比如说:EmailFiled,URLFiled和IPAdressField;

他们分别可以进行验证用户传入的值是否是有效的Email地址,URL和IP地址。

3.BooleanField和NullBooleanField都是可以存储True和False的;但是前者不可以是空和NULL,后者可以。

4.FileField和FIlePathField用来保存用户上传的文件的路径;

5.Django 会自动为你生成一个名称为id的主键,如果想要自己定义可以通过AutoField属性;如果希望某个属性成为主键可以在属性后面加上 primary_key = True;而定义unique=True则可以保证变量值的唯一性;

模型与模型(表与表)之间的关系:

主要有两种:

1.多对一。

举例:

class Author(models.Model):

name = CharField(length=10)

class Book(models.Model):

title = CharField(max_length=10)

author = ForeignKey(Author)

这样的话每一个Book对象都会有一个ForeignKey,也就是author.在业务上的意义就是每一本书都可以对应一个作者,并且不同的书可以对应一个作者,但是这样有一个缺陷就是,如果一本书有多个作者,这个关系模型就无法表示了。这样的话就要用到下面的多对多的关系了。

2.多对多。

class Author(models.Model):

name = CharField(max_length=10)

class Book(models.Model):

title = CharField(max_length=10)

author = ManyToManyField(Author)

关系数据库本身没多多对多的关系,Django是在数据库中新建了一张表专门用来存储多对多的关系。

PS:记得引用的ForeignKey和ManyToManyField一定要在Author的后面,如果不在后面要将参数写成字符串形式('Author')。并且ForeignKey和ManyToManyField这段关系在两个类里面都可以声明,作用是一样的,django会自动为我们把另外一半关系给对称过去。

model 类的继承

共有两种不同的继承方式:

1.抽象基础类

具体表现就是不会创建实际的基类数据表,只会创建子类的数据表;

class Meta:

abstract = True

2.多表继承

具体表现就是每一个类包括父类和子类都会创建一张数据表;

上面讲的主要是model中数据库表的建立,下面开始查询的部分:

主要使用的是相似的两个类:Manager和QuerySet

1.除了有特别的指定,Managerl类会默认附着在每一个model类里面,所以默认情况下每个模型类都会有一个objects属性,他构成了这个model在数据库中的所有查询;

2.几个常见的查询方法:

all:返回一个模型中所有数据库记录的QuerySet;

filter: 返回一个包含指定条件的模型记录的QuerySet;

exclude: 和filter 正好相反;

get: 获取单个符合条件的记录,(没找到或者超出一个的记录都会返回异常;)

(QuerySet即为:数据库每一行记录的列表;使用Queryset查询的数据都是缓存在内存中的);

books = Books.objects.filter(title_contains="Tree")相当于:

select * from books where title like *%Tree%*

everone = Person.objects.all()相当于:

select * from Person

overdue_books = book_queryset.filter(due_date__lt=today);

QuerySet中有,而Manager对象中没有的方法:

对查询的结果排序:

all_sorted_first = Person.objects.all().order_by('first_name');

其他改变查询的方法:

Person.objects.values('first')返回一个包含所有first name名字的字典;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: