Django中的源码续

  1. ##################################################
  2. # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
  3. ##################################################
  4.  
  5. def raw(self, raw_query, params=None, translations=None, using=None):
  6. # 执行原生SQL
  7. models.UserInfo.objects.raw('select * from userinfo')
  8.  
  9. # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
  10. models.UserInfo.objects.raw('select id as nid from 其他表')
  11.  
  12. # 为原生SQL设置参数
  13. models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[,])
  14.  
  15. # 将获取的到列名转换为指定列名
  16. name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
  17. Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
  18.  
  19. # 指定数据库
  20. models.UserInfo.objects.raw('select * from userinfo', using="default")
  21.  
  22. ################### 原生SQL ###################
  23. from django.db import connection, connections
  24. cursor = connection.cursor() # cursor = connections['default'].cursor()
  25. cursor.execute("""SELECT * from auth_user where id = %s""", [])
  26. row = cursor.fetchone() # fetchall()/fetchmany(..)
  27.  
  28. def values(self, *fields):
  29. # 获取每行数据为字典格式
  30.  
  31. def values_list(self, *fields, **kwargs):
  32. # 获取每行数据为元祖
  33.  
  34. def dates(self, field_name, kind, order='ASC'):
  35. # 根据时间进行某一部分进行去重查找并截取指定内容
  36. # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
  37. # order只能是:"ASC" "DESC"
  38. # 并获取转换后的时间
  39. - year : 年--
  40. - month: 年-月-
  41. - day : 年-月-日
  42. 下面这句话就会截取到日,即年月日,如果填写的是year,则只会取到年
  43. models.DatePlus.objects.dates('ctime','day','DESC')
  44.  
  45. def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
  46. # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
  47. # kind只能是 "year", "month", "day", "hour", "minute", "second"
  48. # order只能是:"ASC" "DESC"
  49. # tzinfo时区对象
  50. models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
  51. models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
  52.  
  53. """
  54. pip3 install pytz
  55. import pytz
  56. pytz.all_timezones
  57. pytz.timezone(‘Asia/Shanghai’)
  58. """
  59.  
  60. def none(self):
  61. # 空QuerySet对象
  62.  
  63. ####################################
  64. # METHODS THAT DO DATABASE QUERIES #
  65. ####################################
  66.  
  67. def aggregate(self, *args, **kwargs):
  68. # 聚合函数,获取字典类型聚合结果,对整个表做聚合
  69. from django.db.models import Count, Avg, Max, Min, Sum
  70. result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
  71. ===> {'k': , 'n': }
  72. result = models.UserInfo.objects.aggregate(n=count('nid'))相当于下面sql语句:
  73. select count(nid) as n from UserInfo
  74. 如果添加distinct=True则先去重在聚合
  75.  
  76. def count(self):
  77. # 获取个数
  78.  
  79. def get(self, *args, **kwargs):
  80. # 获取单个对象
  81.  
  82. def create(self, **kwargs):
  83. # 创建对象
  84.  
  85. def bulk_create(self, objs, batch_size=None):
  86. # 批量插入
  87. # batch_size表示一次插入的个数
  88. objs = [
  89. models.DDD(name='r11'),
  90. models.DDD(name='r22')
  91. ]
  92. 参数10表示一次插入多少个,即将数据进行分批插入
  93. models.DDD.objects.bulk_create(objs, )
  94.  
  95. def get_or_create(self, defaults=None, **kwargs):
  96. # 如果存在,则获取,否则,创建
  97. # defaults 指定创建时,其他字段的值,defaults后面的内容表示前面的username不存在的时候,用于创建
  98. obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '','u_id': , 't_id': })
  99.  
  100. def update_or_create(self, defaults=None, **kwargs):
  101. # 如果存在,则更新,否则,创建
  102. # defaults 指定创建时或更新时的其他字段
  103. obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '','u_id': , 't_id': })
  104.  
  105. def first(self):
  106. # 获取第一个
  107.  
  108. def last(self):
  109. # 获取最后一个
  110.  
  111. def in_bulk(self, id_list=None):
  112. # 根据主键ID进行查找
  113. id_list = [,,]
  114. models.DDD.objects.in_bulk(id_list)
  115.  
  116. def delete(self):
  117. # 删除
  118.  
  119. def update(self, **kwargs):
  120. # 更新
  121.  
  122. def exists(self):
  123. # 是否有结果

model里的验证功能(较弱)

当在models里写如下代码:

  1. class UserInfo(models.Model):
  2. name = models.CharField(max_length=)
  3. email = models.EmailField()

这样在views函数里用下面方式添加用户时:

models.UserInfo.objects.create(name="root",email="123")

或者:

obj = models.UserInfo(name="zhaofan",email = "123")

obj.save()

这种情况下email的格式并不对,但是这样添加时是可以添加成功,并不会报错

但是通过obj = models.UserInfo(name="zhaofan",email = "123")方式添加用户时,obj这里有一个方法full_clean(),当添加这个方法的时候就会添加验证功能,完整代码如下:

obj = models.UserInfo(name="zhaofan",email = "123")

obj.full_clean()

obj.save()

这样就会提示如下错误:

查看full_clean源码

可以看出clean_fields是对各个字段进行验证

下面还有一个clean方法,查看源码

可以看出这里是Django预留的一个钩子

对于这个clean钩子的一个使用例子:

  1. from django.core.exceptions import ValidationError
  2. class UserInfo(models.Model):
  3. name = models.CharField(max_length=)
  4. email = models.EmailField()
  5.  
  6. def clean(self):
  7. c = UserInfo.objects.filter(name=self.name).count()
  8. if c:
  9. raise ValidationError(message="用户名已经存在",code="cc1")

这里通过clean定制了一个name值唯一的操作

这里需要知道full_clean验证的顺序:

1、    验证每个字段的正则

2、    验证clean钩子函数

Django之model操作(续)的更多相关文章

  1. Django之Model操作

    Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...

  2. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  3. django的model操作整理

    单表操作 增加数据 auther_obj = {"auther_name":"崔皓然","auther_age":1} models.aut ...

  4. Django之Model操作进阶篇

    常用参数 null 数据库中字段是否可以为空 db_column 数据库中字段的列名 default 数据库中字段的默认值 primary_key 数据库中字段是否为主键 db_index 数据库中字 ...

  5. 补齐-Django之Model操作

    http://www.cnblogs.com/wupeiqi/articles/6216618.html

  6. Djang之Model操作

    Django之Model操作 一.字段 1.字段列表: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField ...

  7. django (四) model模型

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

  8. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  9. Django(八)上:Model操作和Form操作

    ↑↑↑点上面的”+”号展开目录 Model和Form以及ModelForm简介 Model操作: 创建数据库表结构 操作数据库表 做一部分的验证 Form操作: 数据验证(强大) ModelForm ...

随机推荐

  1. 企业和开发人员究竟该如何适应web标准?

    以下几点注意事项仅供参考:完善的前期策划和分析完善的前期逻辑模型以及项目规范性文档的制定尽可能将行政性干预移到策划阶段(按照国内的情况,做到这一点可能很困难)尽可能向后兼容,在项目规范性文档制定阶段对 ...

  2. CSS3 Gradients(渐变)

    CSS3 Gradients(渐变) 一.简介 CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果.但是,通过使用 CSS3 渐 ...

  3. JavScript 日期格式化

    JavScript 日期格式化 //日期格式化 function formatDate(date,fmt) { if(date == null || typeof (date) == undefine ...

  4. 20145328 《Java程序设计》第8周学习总结

    20145328 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),re ...

  5. 20144303 《Java程序设计》第一周学习总结

    20144303 <Java程序设计>第一周学习总结 教材学习内容总结 下载.安装.调试了JDK. JavaSE是各语言个应用平台的基础,分为四个主要的部分:JVE,JRE,JDK,和ja ...

  6. MR案例:单表关联查询

    "单表关联"这个实例要求从给出的数据中寻找所关心的数据,它是对原始数据所包含信息的挖掘. 需求:实例中给出 child-parent(孩子—父母)表,要求输出 grandchild ...

  7. 阿里云 yum 源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  8. C语言之浅析网络包解析

    1.这几天研究skynet中的 lua-netpack.c 中的解析数据包过程.于是把lua部分去掉,修改了一些接口,留下解包相关的代码.再结合云风写的网络代码的例子, 写了一个最简单形式的客户端封包 ...

  9. spring @RequestMapping注解技巧

    @RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一.这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上. 下面我们看看,@Request ...

  10. 修改input的placeholder颜色

    1.CSS选择器 因为每个浏览器的CSS选择器有所差异,所以需要针对每个浏览器做单独的设定. ::-webkit-input-placeholder { /* WebKit browsers */ c ...