Django之Model组件

前端之家收集整理的这篇文章主要介绍了Django之Model组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Model组件在就已经提到过了,本章介绍更多高级部分。

一、回顾1、定义表(类)
django.db <span style="color: #0000ff;">class user(models.Model): <span style="color: #008000;">#<span style="color: #008000;">数据库表名为app_classname,比如现在这个表存在数据库中为cmdb_user
name=models.CharField(max_length=24) <span style="color: #008000;">#
<span style="color: #008000;">字符串,最大长度24
age=models.IntegerField() <span style="color: #008000;">#<span style="color: #008000;">整数类型

<span style="color: #008000;">#<span style="color: #008000;">#一对多
<span style="color: #0000ff;">from django.db <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> user(models.Model):
name=models.CharField(max_length=24<span style="color: #000000;">)
age=<span style="color: #000000;">models.IntegerField()
user_group=models.ForeignKey(<span style="color: #800000;">'<span style="color: #800000;">usergroup<span style="color: #800000;">',to_field=<span style="color: #800000;">'<span style="color: #800000;">gid<span style="color: #800000;">')<span style="color: #008000;">#<span style="color: #008000;">外键约束,to_field表示关联的字段,生成的字段为user_group_id,不写的话默认和表的主键关联

<span style="color: #0000ff;">class<span style="color: #000000;"> usergroup(models.Model):
gid=models.AutoField(primary_key=<span style="color: #000000;">True)
groupname=models.CharField(max_length=20,unique=<span style="color: #000000;">True)
ctime=models.DateField(auto_now_add=<span style="color: #000000;">True)

<span style="color: #008000;">#<span style="color: #008000;">#一对一
<span style="color: #0000ff;">from django.db <span style="color: #0000ff;">import<span style="color: #000000;"> models

<span style="color: #0000ff;">class<span style="color: #000000;"> user(models.Model):
name=models.CharField(max_length=24<span style="color: #000000;">)
age=<span style="color: #000000;">models.IntegerField()
user_group=models.ForeignKey(<span style="color: #800000;">'<span style="color: #800000;">usergroup<span style="color: #800000;">',to_field=<span style="color: #800000;">'<span style="color: #800000;">gid<span style="color: #800000;">',unique=True)<span style="color: #008000;">#<span style="color: #008000;">加上unique=True确保是一一对应

<span style="color: #0000ff;">class<span style="color: #000000;"> usergroup(models.Model):
gid=models.AutoField(primary_key=<span style="color: #000000;">True)
groupname=models.CharField(max_length=20,unique=<span style="color: #000000;">True)
ctime=models.DateField(auto_now_add=<span style="color: #000000;">True)

<span style="color: #008000;">#<span style="color: #008000;">##多对多<span style="color: #008000;">

<span style="color: #008000;">#########第一种使用传统外键方式关联(自己定义关系)######

<span style="color: #0000ff;">class<span style="color: #000000;"> Host(models.Model):
hid=models.AutoField(primary_key=<span style="color: #000000;">True)
hostname=models.CharField(max_length=20<span style="color: #000000;">)
ip=<span style="color: #000000;">models.GenericIPAddressField()

<span style="color: #0000ff;">class<span style="color: #000000;"> HostGroup(models.Model):
gid=models.AutoField(primary_key=<span style="color: #000000;">True)
groupname=models.CharField(max_length=22<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">自己定义第三张表,可以随意添加字段
<span style="color: #0000ff;">class<span style="color: #000000;"> HostToGroup(models.Model):
hobj=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">Host<span style="color: #800000;">',to_field=<span style="color: #800000;">"<span style="color: #800000;">hid<span style="color: #800000;">")<span style="color: #008000;">#<span style="color: #008000;">生成数据库表字段为hobj_id
gobj=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">HostGroup<span style="color: #800000;">',to_field=<span style="color: #800000;">"<span style="color: #800000;">gid<span style="color: #800000;">")<span style="color: #008000;">#<span style="color: #008000;">生成数据库表字段为gobj_id

<span style="color: #008000;">#<span style="color: #008000;">#########第二种使用django自带的方式创建########
<span style="color: #0000ff;">class<span style="color: #000000;"> Host(models.Model):
hid=models.AutoField(primary_key=<span style="color: #000000;">True)
hostname=models.CharField(max_length=20<span style="color: #000000;">)
ip=<span style="color: #000000;">models.GenericIPAddressField()

<span style="color: #0000ff;">class<span style="color: #000000;"> HostGroup(models.Model):
gid=models.AutoField(primary_key=<span style="color: #000000;">True)
groupname=models.CharField(max_length=22<span style="color: #000000;">)
hobj=models.ManyToManyField(<span style="color: #800000;">'<span style="color: #800000;">Host<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">使用django自带字段创建第三张表,自动关联主键,数据库表名为cmdb_hostgroup_hobj,这种方式不能直接操作第三张表,可以间接操作

<span style="color: #008000;">#<span style="color: #008000;">########第三种自定义第三张表,使用django创建m2m关联字段
<span style="color: #0000ff;">class<span style="color: #000000;"> Host(models.Model):
hid=models.AutoField(primary_key=<span style="color: #000000;">True)
hostname=models.CharField(max_length=20<span style="color: #000000;">)
ip=models.GenericIPAddressField() m=models.ManyToManyField(<span style="color: #800000;">'<span style="color: #800000;">HostGrop<span style="color: #800000;">',through=<span style="color: #800000;">'<span style="color: #800000;">HostToGroup<span style="color: #800000;">',through_fields=[<span style="color: #800000;">'<span style="color: #800000;">hobj<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">gobj<span style="color: #800000;">'<span style="color: #000000;">])<span style="color: #008000;">#<span style="color: #008000;">通过自定义m2m关系只能做查询操作

<span style="color: #0000ff;">class<span style="color: #000000;"> HostGroup(models.Model):
gid=models.AutoField(primary_key=<span style="color: #000000;">True)
groupname=models.CharField(max_length=22<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">自己定义第三张表,可以随意添加字段
<span style="color: #0000ff;">class<span style="color: #000000;"> HostToGroup(models.Model):
hobj=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">Host<span style="color: #800000;">',to_field=<span style="color: #800000;">"<span style="color: #800000;">gid<span style="color: #800000;">")<span style="color: #008000;">#<span style="color: #008000;">生成数据库

 2、model字段介绍

自定义无符号整数字段

3、字段参数

4、元数据自定义

通过自定义元数据可以自定义一些特性

= models.AutoField(primary_key== models.CharField(max_length=32Meta: 数据库中生成的表名称 默认 app名称 + 下划线 + 类名 db_table = 自定义表名字
        <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 联合索引,最左前缀模式,当<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>字段中的where条件必须从pub_date开头才能匹配到索引</span>
        index_together =<span style="color: #000000;"&gt; [
            (</span><span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;pub_date</span><span style="color: #800000;"&gt;"</span>,<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;deadline</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;),]

        
<span style="color: #008000;">#<span style="color: #008000;"> 联合唯一索引
unique_together = ((<span style="color: #800000;">"<span style="color: #800000;">driver<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">restaurant<span style="color: #800000;">"<span style="color: #000000;">),)

        </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; admin中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>的表<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a></span>

<span style="color: #000000;"> verbose_name

        </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; verbose_name加s</span>
        verbose_name_plural</pre>

 5、多表关系参数

ForeignKey(ForeignObject) to, to_field=None,名称 on_delete=None,删除关联表中的数据时,当前表与其关联的行的行为 -删除关联数据,与之关联也删除 -删除关联数据,引发错误IntegrityError -删除关联数据,引发错误ProtectedError -删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) -删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) -删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
                                                    </span><span style="color: #0000ff;"&gt;def</span><span style="color: #000000;"&gt; func():
                                                        </span><span style="color: #0000ff;"&gt;return</span> 10

                                                    <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; MyModel(models.Model):
                                                        user </span>=<span style="color: #000000;"&gt; models.ForeignKey(
                                                            to</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;User</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,to_field</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;id</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;
                                                            on_delete</span>=<span style="color: #000000;"&gt;models.SET(func),)
    related_name</span>=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()</span>
    related_query_name=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')</span>
    limit_choices_to=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 在Admin或ModelForm中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据时,提供的条件:</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 如:</span>
                                        - limit_choices_to={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;nid__gt</span><span style="color: #800000;"&gt;'</span>: 5<span style="color: #000000;"&gt;}
                                        </span>- limit_choices_to=<span style="color: #0000ff;"&gt;lambda</span> : {<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;nid__gt</span><span style="color: #800000;"&gt;'</span>: 5<span style="color: #000000;"&gt;}

                                        </span><span style="color: #0000ff;"&gt;from</span> django.db.models <span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; Q
                                        </span>- limit_choices_to=Q(nid__gt=10<span style="color: #000000;"&gt;)
                                        </span>- limit_choices_to=Q(nid=8) | Q(nid__gt=10<span style="color: #000000;"&gt;)
                                        </span>- limit_choices_to=<span style="color: #0000ff;"&gt;lambda</span> : Q(Q(nid=8) | Q(nid__gt=10)) &amp; Q(caption=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;root</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    db_constraint</span>=True          <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中创建外键约束</span>
    parent_link=False           <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 在Admin中是否<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据</span>

<span style="color: #000000;">

OneToOneField(ForeignKey)
    to,</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 要进行关联的表名</span>
    to_field=None               <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 要关联的表中的字段<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a></span>
    on_delete=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 当<a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>关联表中的数据时,当前表与其关联的行的行为</span>

                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;##### 对于一对一 ######</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 1. 一对一其实就是 一对多 + 唯一索引</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 2.当两个类之间有继承关系时,默认会创建一个一对一字段</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 如下会在A表中额外<a href="/tag/zengjia/" target="_blank" class="keywords">增加</a>一个c_ptr_id列且唯一:</span>
                                        <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; C(models.Model):
                                            nid </span>= models.AutoField(primary_key=<span style="color: #000000;"&gt;True)
                                            part </span>= models.CharField(max_length=12<span style="color: #000000;"&gt;)

                                        </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; A(C):
                                            id </span>= models.AutoField(primary_key=<span style="color: #000000;"&gt;True)
                                            code </span>= models.CharField(max_length=1<span style="color: #000000;"&gt;)

ManyToManyField(RelatedField)
    to,</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 要进行关联的表名</span>
    related_name=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 在Admin或ModelForm中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据时,提供的条件:</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 如:</span>
                                        - limit_choices_to={<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;nid__gt</span><span style="color: #800000;"&gt;'</span>: 5<span style="color: #000000;"&gt;}
                                        </span>- limit_choices_to=<span style="color: #0000ff;"&gt;lambda</span> : {<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;nid__gt</span><span style="color: #800000;"&gt;'</span>: 5<span style="color: #000000;"&gt;}

                                        </span><span style="color: #0000ff;"&gt;from</span> django.db.models <span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; Q
                                        </span>- limit_choices_to=Q(nid__gt=10<span style="color: #000000;"&gt;)
                                        </span>- limit_choices_to=Q(nid=8) | Q(nid__gt=10<span style="color: #000000;"&gt;)
                                        </span>- limit_choices_to=<span style="color: #0000ff;"&gt;lambda</span> : Q(Q(nid=8) | Q(nid__gt=10)) &amp; Q(caption=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;root</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
    symmetrical</span>=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段</span>
                                <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 做如下操作时,不同的symmetrical会有不同的可选字段</span>

<span style="color: #000000;"> models.BB.objects.filter(...)

                                    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 可选字段有:code,id,m1</span>
                                        <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; BB(models.Model):

                                        code </span>= models.CharField(max_length=12<span style="color: #000000;"&gt;)
                                        m1 </span>= models.ManyToManyField(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;self</span><span style="color: #800000;"&gt;'</span>,symmetrical=<span style="color: #000000;"&gt;True)

                                    </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 可选字段有: bb,code,symmetrical=<span style="color: #000000;"&gt;False)

    through</span>=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>第三张表时,使用字段用于指定关系表</span>
    through_fields=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>第三张表时,使用字段用于指定关系表中那些字段做多对多关系表</span>
                                    <span style="color: #0000ff;"&gt;from</span> django.db <span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; models

                                    </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Person(models.Model):
                                        name </span>= models.CharField(max_length=50<span style="color: #000000;"&gt;)

                                    </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Group(models.Model):
                                        name </span>= models.CharField(max_length=128<span style="color: #000000;"&gt;)
                                        members </span>=<span style="color: #000000;"&gt; models.ManyToManyField(
                                            Person,through</span>=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Membership</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,through_fields</span>=(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;group</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;person</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;),)

                                    </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Membership(models.Model):
                                        group </span>= models.ForeignKey(Group,on_delete=<span style="color: #000000;"&gt;models.CASCADE)
                                        person </span>= models.ForeignKey(Person,on_delete=<span style="color: #000000;"&gt;models.CASCADE)
                                        inviter </span>=<span style="color: #000000;"&gt; models.ForeignKey(
                                            Person,on_delete</span>=<span style="color: #000000;"&gt;models.CASCADE,related_name</span>=<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;membership_invites</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,)
                                        invite_reason </span>= models.CharField(max_length=64<span style="color: #000000;"&gt;)
    db_constraint</span>=True,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 是否在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中创建外键约束</span>
    db_table=None,<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 默认创建第三张表时,<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中表的<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a></span></pre>

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">二、操作</td>
</tr></table>

1.连表正反向查询(反向通过表__set查询)

=models.CharField(max_length=30<span style="color: #0000ff;">class<span style="color: #000000;"> person(models.Model):
username
=models.CharField(max_length=32<span style="color: #000000;">)
pwd
=models.CharField(max_length=32<span style="color: #000000;">)
ut
=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">Usertype<span style="color: #800000;">',to_field=<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">'<span style="color: #000000;">)

<span style="color: #008000;">#<span style="color: #008000;">##正向查询,通过.的方式
v=<span style="color: #000000;">models.person.objects.all()
<span style="color: #0000ff;">for row <span style="color: #0000ff;">in<span style="color: #000000;"> v:
<span style="color: #0000ff;">print<span style="color: #000000;">(row.username,row.pwd,row.ut.name)

<span style="color: #008000;">#<span style="color: #008000;">##反向查询,默认通过:类名__set获取,字段通过:表__获取,若设置了关联查询参数(related_name),则改变
v1=<span style="color: #000000;">models.Usertype.objects.all()
<span style="color: #0000ff;">for row1 <span style="color: #0000ff;">in<span style="color: #000000;"> v1:
<span style="color: #0000ff;">print<span style="color: #000000;">(row1.name,row1.id,row1.person_set.all())

models.Usertype.objects.values(<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">person__username<span style="color: #800000;">')

 2、增、删、改、查

增加一条数据,可以接受字典类型数据 **kwargs
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj = models.Tb1(c1='xx',c2='oo')</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.save()</span>

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 查</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all() # 获取全部
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(name='seven') # 获取指定条件的数据

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 删</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 改</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a> **kwargs</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj = models.Tb1.objects.get(id=1)</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.c1 = '111'</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.save()                                                 # <a href="/tag/xiugai/" target="_blank" class="keywords">修改</a>单条数据</span></pre>

3、排序、聚合

获取个数
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 大于,小于</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idgt=1) # 获取id大于1的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id
lt=10) # 获取id小于10的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idlt=10,idgt=1) # 获取id大于1 且 小于10的值

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; in</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__in=[11,22,33]) # 获取id等于11、22、33的数据
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(id__in=[11,33]) # not in

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; isnull</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Entry.objects.filter(pub_date__isnull=True)</span>

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; contains</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(namecontains="ven")
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name
icontains="ven") # icontains大小写不敏感
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(name__icontains="ven")

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; range</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__range=[1,2]) # 范围bettwen and

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 其他类似</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> startswith,istartswith,endswith,iendswith,

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; order by</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').order_by('id') # asc
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').order_by('-id') # desc

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; group by #当values后面是annotate时候,此时不在时<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>,而是分组</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> from django.db.models import Count,Min,Max,Sum
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
<span style="color: #008000;">#<span style="color: #008000;"> SELECT "app01_tb1"."id",COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; limit 、offset</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all()[10:20]

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; regex正则匹配,iregex 不区分大小写</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.get(titleregex=r'^(An?|The) +')
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.get(title
iregex=r'^(an?|the) +')

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; date</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__date=datetime.date(2005,1,1))
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datedategt=datetime.date(2005,1))

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; year</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__year=2005)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_dateyeargte=2005)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; month</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__month=12)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datemonthgte=6)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; day</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__day=3)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datedaygte=3)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; week_day</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_dateweek_day=2)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date
week_day__gte=2)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; hour</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphour=23)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
hour=5)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphourgte=12)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; minute</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminute=29)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
minute=46)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminutegte=29)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; second</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecond=31)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
second=2)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecondgte=31)

 4、使用子查询和执行原生sql

%s"},select_params=(1,)) 2,'name'='wd'],or条件['id'>2 or 'name'='wd'],使用函数['fund(ctime)=1','name'='wd'] %s"},),order_by=['-nid'])#这里还可以使用MysqL中的函数
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; F</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> from django.db.models import F
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.update(num=F('num')+1)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Q</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> 方式一:
<span style="color: #008000;">#<span style="color: #008000;"> Q(nidgt=10)
<span style="color: #008000;">#<span style="color: #008000;"> Q(nid=8) | Q(nid
gt=10)
<span style="color: #008000;">#<span style="color: #008000;"> Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 方式二:</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; con = Q()</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q1 = Q()</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q1.connector = 'OR'</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q1.children.append(('id',1))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q1.children.append(('id',10))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q1.children.append(('id',9))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q2 = Q()</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q2.connector = 'OR'</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q2.children.append(('c1',1))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q2.children.append(('c1',10))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; q2.children.append(('c1',9))</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; con.add(q1,'AND')</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; con.add(q2,'AND')</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(con)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 执行原生<a href="/tag/sql/" target="_blank" class="keywords">sql</a></span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> from django.db import connection,connections
<span style="color: #008000;">#<span style="color: #008000;"> cursor = connection.cursor() # cursor = connections['default'].cursor()
<span style="color: #008000;">#<span style="color: #008000;"> cursor.execute("""SELECT * from auth_user where id = %s""",[1])
<span style="color: #008000;">#<span style="color: #008000;"> row = cursor.fetchone()

 5、QuerySet对象方法详解

方法详解

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

<tr>
<td><span style="font-size: 16px;">三、model的验证功能以及内置钩子</td>
</tr></table>

我们知道,model可以用来对数据库进行操作,但是Django中model提供了弱小的验证功能

1、验证功能

通过创建对象使用save方法进行操作创建,在对象中使用full_clean()进行验证,使用异常捕捉来进行处理

user_obj=models.user.objects.create(name=,age=22,user_group_id=

2、内置钩子

通过创建对象时,会执行顺序执行full_clean()-->clean_fields()-->clean(),我们可以自定义clean函数进行验证,其中clean_fields方法是字段正则验证

=models.CharField(max_length=24==models.ForeignKey(,null=True,unique=True)生成的字段为user_group_id
<span style="color: #0000ff;"&gt;def</span> clean(self):   <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;<a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>clean验证</span>
    <span style="color: #0000ff;"&gt;from</span> django.core.exceptions <span style="color: #0000ff;"&gt;import</span><span style="color: #000000;"&gt; ValidationError
    c</span>=user.objects.filter(name=<span style="color: #000000;"&gt;self.name).count()
    </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt; c:
        </span><span style="color: #0000ff;"&gt;raise</span> ValidationError(message=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;<a href="/tag/yonghuming/" target="_blank" class="keywords">用户名</a>已经存在</span><span style="color: #800000;"&gt;'</span>,code=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;00</span><span style="color: #800000;"&gt;'</span>)  <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;由于clean<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>捕获ValidationError,所以我们需要抛出该异常才能被捕获到</span>
    </pre>

猜你在找的Django相关文章