网站怎样防止攻击,云指建站平台,普通的宣传网站用什么做,门户网站系统建设清单ORM相关 MVC或者MVC框架中包括一个重要的部分#xff0c;就是ORM#xff0c;它实现了数据模型与数据库的解耦#xff0c;即数据模型的设计不需要依赖于特定的数据库#xff0c;通过简单的配置就可以轻松更换数据库#xff0c;这极大的减轻了开发人员的工作量#xff0c;不…ORM相关 MVC或者MVC框架中包括一个重要的部分就是ORM它实现了数据模型与数据库的解耦即数据模型的设计不需要依赖于特定的数据库通过简单的配置就可以轻松更换数据库这极大的减轻了开发人员的工作量不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映射”的简称。 一单表操作略 二多表操作 1创建模型 全程通过实例演示 作者模型一个作者有姓名和年龄。作者详细模型把作者的详情放到详情表包含生日手机号家庭住址等信息。作者详情模型和作者模型之间是一对一的关系one-to-one出版商模型出版商有名称所在城市以及email。书籍模型 书籍有书名和出版日期一本书可能会有多个作者一个作者也可以写多本书所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版所以出版商和书籍是一对多关联关系(one-to-many)。模型建立如下 rom django.db import models
# Create your models here.class Author(models.Model):nid models.AutoField(primary_keyTrue)namemodels.CharField( max_length32)agemodels.IntegerField()# 与AuthorDetail建立一对一的关系authorDetailmodels.OneToOneField(toAuthorDetail,on_deletemodels.CASCADE)class AuthorDetail(models.Model):nid models.AutoField(primary_keyTrue)birthdaymodels.DateField()telephonemodels.BigIntegerField()addrmodels.CharField( max_length64)class Publish(models.Model):nid models.AutoField(primary_keyTrue)namemodels.CharField( max_length32)citymodels.CharField( max_length32)emailmodels.EmailField()class Book(models.Model):nid models.AutoField(primary_keyTrue)title models.CharField( max_length32)publishDatemodels.DateField()pricemodels.DecimalField(max_digits5,decimal_places2)# 与Publish建立一对多的关系,外键字段建立在多的一方publishmodels.ForeignKey(toPublish,to_fieldnid,on_deletemodels.CASCADE)# 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个自动创建第三张表authorsmodels.ManyToManyField(toAuthor,) View Code 注意事项 表的名称myapp_modelName是根据 模型中的元数据自动生成的也可以覆写为别的名称 id 字段是自动添加的对于外键字段Django 会在字段名上添加_id 来创建数据库中的列名这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。定义好模型之后你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置在其中添加models.py所在应用的名称。外键字段 ForeignKey 有一个 nullTrue 的设置(它允许外键接受空值 NULL)你可以赋给它空值 None 2添加表纪录 一对多 方式1:publish_objPublish.objects.get(nid1)book_objBook.objects.create(title金瓶眉,publishDate2012-12-12,price100,publishpublish_obj)方式2:book_objBook.objects.create(title金瓶眉,publishDate2012-12-12,price100,publish_id1) 多对多 # 当前生成的书籍对象book_objBook.objects.create(title追风筝的人,price200,publishDate2012-11-12,publish_id1)# 为书籍绑定的做作者对象yuanAuthor.objects.filter(nameyuan).first() # 在Author表中主键为2的纪录egonAuthor.objects.filter(namealex).first() # 在Author表中主键为1的纪录# 绑定多对多关系,即向关系表book_authors中添加纪录book_obj.authors.add(yuan,egon) # 将某些特定的 model 对象添加到被关联对象集合中。 多对多关系其它常用API book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 book_obj.authors.remove(*[])
book_obj.authors.clear() #清空被关联对象集合
book_obj.authors.set() #先清空再设置 补充 class RelatedManager 关联管理器是在一对多或者多对多的关联上下文中使用的管理器。它存在于下面两种情况ForeignKey关系的“另一边”。像这样 from django.db import modelsclass Reporter(models.Model):# ...passclass Article(models.Model):reporter models.ForeignKey(Reporter) 在上面的例子中管理器reporter.article_set拥有下面的方法。ManyToManyField关系的两边 class Topping(models.Model):# ...passclass Pizza(models.Model):toppings models.ManyToManyField(Topping) 这个例子中topping.pizza_set 和pizza.toppings都拥有下面的方法。add(obj1[, obj2, ...]) create(**kwargs) 创建一个新的对象保存对象并将它添加到关联对象集之中。返回新创建的对象 b Blog.objects.get(id1)e b.entry_set.create(
... headlineHello,
... body_textHi,
... pub_datedatetime.date(2005, 1, 1)
... )# No need to call e.save() at this point -- its already been saved.
这完全等价于不过更加简洁于 b Blog.objects.get(id1)e Entry(
... blogb,
... headlineHello,
... body_textHi,
... pub_datedatetime.date(2005, 1, 1)
... )e.save(force_insertTrue)
要注意我们并不需要指定模型中用于定义关系的关键词参数。在上面的例子中我们并没有传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。 View Code clear() 从关联对象集中移除一切对象。 b Blog.objects.get(id1)b.entry_set.clear()
注意这样不会删除对象 —— 只会删除他们之间的关联。就像 remove() 方法一样clear()只能在 nullTrue的ForeignKey上被调用。 set()方法先清空在设置编辑书籍时即可用到 注意对于所有类型的关联字段add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说在关联的任何一端都不需要再调用save()方法。直接赋值通过赋值一个新的可迭代的对象关联对象集可以被整体替换掉。 new_list [obj1, obj2, obj3]e.related_set new_list 如果外键关系满足nullTrue关联管理器会在添加new_list中的内容之前首先调用clear()方法来解除关联集中一切已存在对象的关联。否则 new_list中的对象会在已存在的关联的基础上被添加。 三 基于对象的跨表查询 一对多查询Publish 与 Book正向查询(按字段publish) # 查询主键为1的书籍的出版社所在的城市
book_objBook.objects.filter(pk1).first()
# book_obj.publish 是主键为1的书籍对象关联的出版社对象
print(book_obj.publish.city) 反向查询(按表名book_set) publishPublish.objects.get(name苹果出版社)
#publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合
book_listpublish.book_set.all()
for book_obj in book_list:print(book_obj.title) 一对一查询(Author 与 AuthorDetail)正向查询(按字段authorDetail) egonAuthor.objects.filter(nameegon).first()
print(egon.authorDetail.telephone) 反向查询(按表名author) # 查询所有住址在北京的作者的姓名authorDetail_listAuthorDetail.objects.filter(addrbeijing)
for obj in authorDetail_list:print(obj.author.name) 多对多查询 (Author 与 Book)正向查询(按字段authors) # 金瓶眉所有作者的名字以及手机号book_objBook.objects.filter(title金瓶眉).first()
authorsbook_obj.authors.all()
for author_obj in authors:print(author_obj.name,author_obj.authorDetail.telephone) 反向查询(按表名book_set) # 查询egon出过的所有书籍的名字
author_objAuthor.objects.get(nameegon)book_listauthor_obj.book_set.all() #与egon作者相关的所有书籍for book_obj in book_list:print(book_obj.title) 注意你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如如果 Article model 中做一下更改 publish ForeignKey(Book, related_namebookList) 接下来就会如我们看到这般 # 查询 人民出版社出版过的所有书籍publishPublish.objects.get(name人民出版社)
book_listpublish.bookList.all() # 与人民出版社关联的所有书籍对象集合 四、基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系它能自动确认 SQL JOIN 联系。要做跨关系查询就使用两个下划线来链接模型(model)间关联字段的名称直到最终链接到你想要的 model 为止。 关键点正向查询按字段反向查询按表名。 一对多查询 # 查询苹果出版社出版过的所有书籍的名字与价格(一对多)# 正向查询 按字段:publishqueryResultBook.objects.filter(publish__name苹果出版社).values_list(title,price)# 反向查询 按表名:bookqueryResultPublish.objects.filter(name苹果出版社).values_list(book__title,book__price) 多对多查询 # 查询alex出过的所有书籍的名字(多对多)# 正向查询 按字段:authors:queryResultBook.objects.filter(authors__namealex).values_list(title)# 反向查询 按表名:bookqueryResultAuthor.objects.filter(namealex).values_list(book__title,book__price) 注意反向查询时如果定义了related_name 则用related_name替换表名例如 publish ForeignKey(Blog, related_namebookList) 练习: 查询人民出版社出版过的所有书籍的名字与价格(一对多) #反向查询 不再按表名:book,而是related_name:bookListqueryResultPublish.objects.filter(name人民出版社).values_list(bookList__title,bookList__price) 五、聚合查询与分组查询 聚合 aggregate(*args, **kwargs) # 计算所有图书的平均价格 from django.db.models import Avg Book.objects.all().aggregate(Avg(price)){price__avg: 34.35} aggregate()是QuerySet 的一个终止子句意思是说它返回一个包含一些键值对的字典。键的名称是聚合值的标识符值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称可以向聚合子句提供它。 Book.objects.aggregate(average_priceAvg(price))
{average_price: 34.35} 如果你希望生成不止一个聚合你可以向aggregate()子句中添加另一个参数。所以如果你也想知道所有图书价格的最大值和最小值可以这样查询 from django.db.models import Avg, Max, MinBook.objects.aggregate(Avg(price), Max(price), Min(price))
{price__avg: 34.35, price__max: Decimal(81.20), price__min: Decimal(12.99)} 分组 ###################################单表分组查询#######################################################
查询每一个部门名称以及对应的员工数
emp:
id name age salary dep
1 alex 12 2000 销售部
2 egon 22 3000 人事部
3 wen 22 5000 人事部
sql语句:
select dep,Count(*) from emp group by dep;
ORM:
emp.objects.all().values(dep).annotate(Count(id)
###################################多表分组查询#######################################################
多表分组查询
查询每一个部门名称以及对应的员工数
emp:
id name age salary dep_id
1 alex 12 2000 1
2 egon 22 3000 2
3 wen 22 5000 2
dep
id name
1 销售部
2 人事部
empdep:
id name age salary dep_id id name
1 alex 12 2000 1 1 销售部
2 egon 22 3000 2 2 人事部
3 wen 22 5000 2 2 人事部
sql语句:
select dep.name,Count(*) from emp left join dep on emp.dep_iddep.id group by emp.dep_id
select dep.name,Count(*) from emp left join dep on emp.dep_iddep.id group by dep.id,dep.name
ORM:
dep.objetcs.all().annotate(cCount(emp)).values(name,c) View Code annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值统计方法用聚合函数。 # 统计每一本书的作者个数bookListBook.objects.annotate(authorsNumCount(authors))
for book_obj in bookList:print(book_obj.title,book_obj.authorsNum) 如果想对所查询对象的关联对象进行聚合 # 统计每一个出版社的最便宜的书publishListPublish.objects.annotate(MinPriceMin(book__price))
for publish_obj in publishList:print(publish_obj.name,publish_obj.MinPrice) annotate的返回值是querySet如果不想遍历对象可以用上valuelist queryResult Publish.objects.annotate(MinPriceMin(book__price)).values_list(name,MinPrice)
print(queryResult) 六、F查询与Q查询: F查询在上面所有的例子中我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较那该怎么做呢Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段来比较同一个 model 实例中两个不同字段的值。 # 查询评论数大于收藏数的书籍from django.db.models import FBook.objects.filter(commnetNum__ltF(keepNum)) Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。 # 查询评论数大于收藏数2倍的书籍Book.objects.filter(commnetNum__ltF(keepNum)*2) 修改操作也可以使用F函数,比如将每一本书的价格提高30元 Book.objects.all().update(priceF(price)30) Q查询: filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询例如OR 语句你可以使用Q 对象。 from django.db.models import Q
Q(title__startswithPy) Q 对象可以使用 和| 操作符组合起来。当一个操作符在两个Q 对象上使用时它产生一个新的Q 对象。 bookListBook.objects.filter(Q(authors__nameyuan)|Q(authors__nameegon)) 等同于下面的SQL WHERE 子句 WHERE name yuan OR name egon 你可以组合 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时Q 对象可以使用~ 操作符取反这允许组合正常的查询和取反(NOT) 查询 bookListBook.objects.filter(Q(authors__nameyuan) ~Q(publishDate__year2017)).values_list(title) 查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数关键字参数或Q 对象都将AND”在一起。但是如果出现Q 对象它必须位于所有关键字参数的前面。例如 bookListBook.objects.filter(Q(publishDate__year2016) | Q(publishDate__year2017),title__icontainspython) 转载于:https://www.cnblogs.com/xh-0205/p/9741123.html