Model组件在就已经提到过了,本章介绍更多高级部分。
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(maxlength=20,unique=<span style="color: #000000;">True)
ctime=models.DateField(autoNow_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(maxlength=20,unique=<span style="color: #000000;">True)
ctime=models.DateField(autoNow_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字段介绍
BigAutoField(AutoField)
</span>- bigint自增列,必须填入参数 primary_key=<span style="color: #000000;">True
注:当model中如果没有自增列,则<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>会创建<a href="/tag/yige/" target="_blank" class="keywords">一个</a>列名为id的列
</span><span style="color: #0000ff;">from</span> django.db <span style="color: #0000ff;">import</span><span style="color: #000000;"> models
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> UserInfo(models.Model):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/zidong/" target="_blank" class="keywords">自动</a>创建<a href="/tag/yige/" target="_blank" class="keywords">一个</a>列名为id的且为自增的整数列</span>
username = models.CharField(max_length=32<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Group(models.Model):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>自增列</span>
nid = models.AutoField(primary_key=<span style="color: #000000;">True)
name </span>= models.CharField(max_length=32<span style="color: #000000;">)
SmallIntegerField(IntegerField):
</span>- 小整数 -32768 ~ 32767<span style="color: #000000;">
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin,IntegerField)
</span>- 正小整数 0 ~ 32767<span style="color: #000000;">
IntegerField(Field)
</span>- 整数列(有符号的) -2147483648 ~ 2147483647<span style="color: #000000;">
PositiveIntegerField(PositiveIntegerRelDbTypeMixin,IntegerField)
</span>- 正整数 0 ~ 2147483647<span style="color: #000000;">
BigIntegerField(IntegerField):
</span>- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807<span style="color: #000000;">
BooleanField(Field)
</span>-<span style="color: #000000;"> 布尔值类型
NullBooleanField(Field):
</span>-<span style="color: #000000;"> 可以为空的布尔值
CharField(Field)
</span>-<span style="color: #000000;"> 字符类型
</span>-<span style="color: #000000;"> 必须提供max_length参数, max_length表示字符长度
TextField(Field)
</span>-<span style="color: #000000;"> 文本类型
EmailField(CharField):
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供验证机制
IPAddressField(Field)
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
GenericIPAddressField(Field)
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
</span>-<span style="color: #000000;"> 参数:
protocol,用于指定Ipv4或Ipv6, </span><span style="color: #800000;">'</span><span style="color: #800000;">both</span><span style="color: #800000;">'</span>,<span style="color: #800000;">"</span><span style="color: #800000;">ipv4</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">ipv6</span><span style="color: #800000;">"</span><span style="color: #000000;">
unpack_ipv4, 如果指定为True,则输入::ffff:</span>192.0.2.1时候,可解析为192.0.2.1,开启刺<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>,需要protocol=<span style="color: #800000;">"</span><span style="color: #800000;">both</span><span style="color: #800000;">"</span><span style="color: #000000;">
URLField(CharField)
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供验证 URL
SlugField(CharField)
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供验证<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a> 字母、数字、下划线、连接符(减号)
CommaSep<a href="/tag/ara/" target="_blank" class="keywords">ara</a>tedIntegerField(CharField)
</span>-<span style="color: #000000;"> 字符串类型,格式必须为逗号分割的数字
UUIDField(Field)
</span>-<span style="color: #000000;"> 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
FilePathField(Field)
</span>-<span style="color: #000000;"> 字符串,Django Admin以及ModelForm中提供读取<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>夹下<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>
</span>-<span style="color: #000000;"> 参数:
path,<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>夹路径
match</span>=<span style="color: #000000;">None,正则匹配
recursive</span>=<span style="color: #000000;">False,递归下面的<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>夹
allow_files</span>=<span style="color: #000000;">True,允许<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>
allow_folders</span>=<span style="color: #000000;">False,允许<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>夹
FileField(Field)
</span>-<span style="color: #000000;"> 字符串,路径保存在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>,<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>到指定目录
</span>-<span style="color: #000000;"> 参数:
upload_to </span>= <span style="color: #800000;">""</span><span style="color: #000000;"> <a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的保存路径
storage </span>=<span style="color: #000000;"> None 存储组件,<a href="/tag/mo/" target="_blank" class="keywords">默</a>认django.core.files.storage.FileSy<a href="/tag/stem/" target="_blank" class="keywords">stem</a>Storage
ImageField(FileField)
</span>-<span style="color: #000000;"> 字符串,路径保存在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>,<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a><a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a>到指定目录
</span>-<span style="color: #000000;"> 参数:
upload_to </span>= <span style="color: #800000;">""</span><span style="color: #000000;"> <a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的保存路径
storage </span>=<span style="color: #000000;"> None 存储组件,<a href="/tag/mo/" target="_blank" class="keywords">默</a>认django.core.files.storage.FileSy<a href="/tag/stem/" target="_blank" class="keywords">stem</a>Storage
width_field</span>=<span style="color: #000000;">None,<a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/tupian/" target="_blank" class="keywords">图片</a>的高度保存的<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>字段名(字符串)
height_field</span>=<span style="color: #000000;">None <a href="/tag/shangchuan/" target="_blank" class="keywords">上传</a><a href="/tag/tupian/" target="_blank" class="keywords">图片</a>的宽度保存的<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>字段名(字符串)
DateTimeField(DateField)
</span>- 日期+时间格式 YYYY-MM-<span style="color: #000000;">DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin,Field)
</span>- 日期格式 YYYY-MM-<span style="color: #000000;">DD
TimeField(DateTimeCheckMixin,Field)
</span>-<span style="color: #000000;"> 时间格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field)
</span>-<span style="color: #000000;"> <a href="/tag/changzhengshu/" target="_blank" class="keywords">长整数</a>,时间间隔,<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中按照bigint存储,ORM中<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>的值为datetime.<a href="/tag/timedelta/" target="_blank" class="keywords">timedelta</a>类型
FloatField(Field)
</span>-<span style="color: #000000;"> 浮点型
DecimalField(Field)
</span>-<span style="color: #000000;"> 10进制小数
</span>-<span style="color: #000000;"> 参数:
max_digits,小数总长度
decimal_places,小数位长度
BinaryField(Field)
</span>- 二进制类型</pre>
<span style="color: #800000;">'<span style="color: #800000;">AutoField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">integer AUTO_INCREMENT<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">BigAutoField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">bigint AUTO_INCREMENT<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">BinaryField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">longblob<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">BooleanField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">bool<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">CharField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">varchar(%(max_length)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">CommaSeparatedIntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">varchar(%(max_length)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">DateField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">date<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">DateTimeField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">datetime<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">DecimalField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">numeric(%(max_digits)s,%(decimal_places)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">DurationField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">bigint<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">FileField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">varchar(%(max_length)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">FilePathField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">varchar(%(max_length)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">FloatField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">double precision<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">IntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">integer<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">BigIntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">bigint<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">IPAddressField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">char(15)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">GenericIPAddressField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">char(39)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">NullBooleanField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">bool<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">OnetoOneField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">integer<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">PositiveIntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">integer UNSIGNED<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">PositiveSmallIntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">smallint UNSIGNED<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">SlugField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">varchar(%(max_length)s)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">SmallIntegerField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">smallint<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">TextField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">longtext<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">TimeField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">time<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">UUIDField<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">char(32)<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #008000;">#<span style="color: #008000;">####注意事项####
1<span style="color: #000000;">.触发Model中的验证和错误提示有两种方式:
a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息
b. 使用ModelForm
c. 调用Model对象的 clean_fields 方法,如:
<span style="color: #008000;">#<span style="color: #008000;"> models.py
<span style="color: #0000ff;">class<span style="color: #000000;"> UserInfo(models.Model):
nid = models.AutoField(primary_key=<span style="color: #000000;">True)
username = models.CharField(max_length=32<span style="color: #000000;">)
email </span>= models.EmailField(error_messages={<span style="color: #800000;">'</span><span style="color: #800000;">invalid</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">格式错了.</span><span style="color: #800000;">'</span><span style="color: #000000;">})
</span><span style="color: #008000;">#</span><span style="color: #008000;"> views.py</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> index(request):
obj </span>= models.UserInfo(username=<span style="color: #800000;">'</span><span style="color: #800000;">11234</span><span style="color: #800000;">'</span>,email=<span style="color: #800000;">'</span><span style="color: #800000;">uu</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(obj.clean_fields())
</span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e:
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(e)
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">ok</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> Model的clean<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>是<a href="/tag/yige/" target="_blank" class="keywords">一个</a>钩子,可用于定制操作,如:上述的异常处理。</span>
2<span style="color: #000000;">.Admin中<a href="/tag/xiugai/" target="_blank" class="keywords">修改</a><a href="/tag/cuowu/" target="_blank" class="keywords">错误</a><a href="/tag/tishi/" target="_blank" class="keywords">提示</a>
</span><span style="color: #008000;">#</span><span style="color: #008000;"> admin.py</span>
<span style="color: #0000ff;">from</span> django.contrib <span style="color: #0000ff;">import</span><span style="color: #000000;"> admin
</span><span style="color: #0000ff;">from</span> model_club <span style="color: #0000ff;">import</span><span style="color: #000000;"> models
</span><span style="color: #0000ff;">from</span> django <span style="color: #0000ff;">import</span><span style="color: #000000;"> forms
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> UserInfoForm(forms.ModelForm):
age </span>= forms.IntegerField(initial=1,error_messages={<span style="color: #800000;">'</span><span style="color: #800000;"><a href="/tag/required/" target="_blank" class="keywords">required</a></span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">请输入数值.</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">invalid</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">年龄必须为数值.</span><span style="color: #800000;">'</span><span style="color: #000000;">})
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> models.UserInfo
</span><span style="color: #008000;">#</span><span style="color: #008000;"> fields = ('username',)</span>
fields = <span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span><span style="color: #000000;">
exclude </span>= [<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span><span style="color: #000000;">]
labels </span>= { <span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">Writer</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
help_texts </span>= {<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:<span style="color: #800000;">'</span><span style="color: #800000;">some useful help text.</span><span style="color: #800000;">'</span><span style="color: #000000;">,}
error_messages</span>={ <span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:{<span style="color: #800000;">'</span><span style="color: #800000;">max_length</span><span style="color: #800000;">'</span>:<span style="color: #800000;">"</span><span style="color: #800000;">this writer name is too long</span><span style="color: #800000;">"</span><span style="color: #000000;">} }
widgets</span>={<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>:Textarea(attrs={<span style="color: #800000;">'</span><span style="color: #800000;">cols</span><span style="color: #800000;">'</span>:80,<span style="color: #800000;">'</span><span style="color: #800000;">rows</span><span style="color: #800000;">'</span>:20<span style="color: #000000;">})}
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> UserInfoAdmin(admin.ModelAdmin):
form </span>=<span style="color: #000000;"> UserInfoForm
admin.site.register(models.UserInfo,UserInfoAdmin)</span></pre>
3、字段参数
verbose_name Admin中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>的字段<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a>
blank Admin中是否允许<a href="/tag/yonghu/" target="_blank" class="keywords">用户</a>输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的<a href="/tag/tishi/" target="_blank" class="keywords">提示</a>信息
choices Admin中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>选择框的<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>,用不变动的数据放在内存中从而避免跨表操作
如:gf </span>= models.IntegerField(choices=[(0,<span style="color: #800000;">'</span><span style="color: #800000;">何穗</span><span style="color: #800000;">'</span>),(1,<span style="color: #800000;">'</span><span style="color: #800000;">大表姐</span><span style="color: #800000;">'</span>),],default=1<span style="color: #000000;">)
error_messages <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>信息(字典类型),从而定制想要<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>的<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>信息;
字典健:null,blank,invalid,invalid_choice,unique,</span><span style="color: #0000ff;">and</span><span style="color: #000000;"> unique_for_date
如:{</span><span style="color: #800000;">'</span><span style="color: #800000;">null</span><span style="color: #800000;">'</span>: <span style="color: #800000;">"</span><span style="color: #800000;">不能为空.</span><span style="color: #800000;">"</span>,<span style="color: #800000;">'</span><span style="color: #800000;">invalid</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">格式<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a></span><span style="color: #800000;">'</span><span style="color: #000000;">}
validators <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a><a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>验证(列表类型),从而定制想要的验证规则
</span><span style="color: #0000ff;">from</span> django.core.validators <span style="color: #0000ff;">import</span><span style="color: #000000;"> RegexValidator
</span><span style="color: #0000ff;">from</span> django.core.validators <span style="color: #0000ff;">import</span><span style="color: #000000;"> EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test </span>=<span style="color: #000000;"> models.CharField(
max_length</span>=32<span style="color: #000000;">,error_messages</span>=<span style="color: #000000;">{
</span><span style="color: #800000;">'</span><span style="color: #800000;">c1</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">优先错信息1</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">c2</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">优先错信息2</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">c3</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">优先错信息3</span><span style="color: #800000;">'</span><span style="color: #000000;">,},validators</span>=<span style="color: #000000;">[
RegexValidator(regex</span>=<span style="color: #800000;">'</span><span style="color: #800000;">root_\d+</span><span style="color: #800000;">'</span>,message=<span style="color: #800000;">'</span><span style="color: #800000;"><a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>了</span><span style="color: #800000;">'</span>,code=<span style="color: #800000;">'</span><span style="color: #800000;">c1</span><span style="color: #800000;">'</span><span style="color: #000000;">),RegexValidator(regex</span>=<span style="color: #800000;">'</span><span style="color: #800000;">root_112233\d+</span><span style="color: #800000;">'</span>,message=<span style="color: #800000;">'</span><span style="color: #800000;">又<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>了</span><span style="color: #800000;">'</span>,code=<span style="color: #800000;">'</span><span style="color: #800000;">c2</span><span style="color: #800000;">'</span><span style="color: #000000;">),EmailValidator(message</span>=<span style="color: #800000;">'</span><span style="color: #800000;">又<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>了</span><span style="color: #800000;">'</span>,code=<span style="color: #800000;">'</span><span style="color: #800000;">c3</span><span style="color: #800000;">'</span><span style="color: #000000;">),]
)
<span style="color: #008000;">#<span style="color: #008000;">###时间的参数auto_Now <span style="color: #008000;">#<span style="color: #008000;">更新时,自动更新为当前时间,仅仅限于obj.save()方法,才会生效
<span style="color: #000000;">
auto_Now_add. <span style="color: #008000;">#<span style="color: #008000;">创建时,自动生成
4、元数据自定义
<span style="color: #008000;">#</span><span style="color: #008000;"> 联合索引,最左前缀模式,当<a href="/tag/chaxunziduan/" target="_blank" class="keywords">查询字段</a>中的where条件必须从pub_date开头才能匹配到索引</span>
index_together =<span style="color: #000000;"> [
(</span><span style="color: #800000;">"</span><span style="color: #800000;">pub_date</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">deadline</span><span style="color: #800000;">"</span><span style="color: #000000;">),]
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;">#</span><span style="color: #008000;"> 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;">#</span><span style="color: #008000;"> verbose_name加s</span>
verbose_name_plural</pre>
5、多表关系参数
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> func():
</span><span style="color: #0000ff;">return</span> 10
<span style="color: #0000ff;">class</span><span style="color: #000000;"> MyModel(models.Model):
user </span>=<span style="color: #000000;"> models.ForeignKey(
to</span>=<span style="color: #800000;">"</span><span style="color: #800000;">User</span><span style="color: #800000;">"</span><span style="color: #000000;">,to_field</span>=<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span><span style="color: #000000;">
on_delete</span>=<span style="color: #000000;">models.SET(func),)
related_name</span>=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()</span>
related_query_name=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 反向操作时,使用的连接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')</span>
limit_choices_to=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 在Admin或ModelForm中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据时,提供的条件:</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 如:</span>
- limit_choices_to={<span style="color: #800000;">'</span><span style="color: #800000;">nid__gt</span><span style="color: #800000;">'</span>: 5<span style="color: #000000;">}
</span>- limit_choices_to=<span style="color: #0000ff;">lambda</span> : {<span style="color: #800000;">'</span><span style="color: #800000;">nid__gt</span><span style="color: #800000;">'</span>: 5<span style="color: #000000;">}
</span><span style="color: #0000ff;">from</span> django.db.models <span style="color: #0000ff;">import</span><span style="color: #000000;"> Q
</span>- limit_choices_to=Q(nid__gt=10<span style="color: #000000;">)
</span>- limit_choices_to=Q(nid=8) | Q(nid__gt=10<span style="color: #000000;">)
</span>- limit_choices_to=<span style="color: #0000ff;">lambda</span> : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=<span style="color: #800000;">'</span><span style="color: #800000;">root</span><span style="color: #800000;">'</span><span style="color: #000000;">)
db_constraint</span>=True <span style="color: #008000;">#</span><span style="color: #008000;"> 是否在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中创建外键约束</span>
parent_link=False <span style="color: #008000;">#</span><span style="color: #008000;"> 在Admin中是否<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据</span>
<span style="color: #000000;">
On<a href="/tag/eto/" target="_blank" class="keywords">eto</a>OneField(ForeignKey)
to,</span><span style="color: #008000;">#</span><span style="color: #008000;"> 要进行关联的表名</span>
to_field=None <span style="color: #008000;">#</span><span style="color: #008000;"> 要关联的表中的字段<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a></span>
on_delete=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 当<a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>关联表中的数据时,当前表与其关联的行的行为</span>
<span style="color: #008000;">#</span><span style="color: #008000;">##### 对于一对一 ######</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 1. 一对一其实就是 一对多 + 唯一索引</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 2.当两个类之间有继承关系时,<a href="/tag/mo/" target="_blank" class="keywords">默</a>认会创建<a href="/tag/yige/" target="_blank" class="keywords">一个</a>一对一字段</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 如下会在A表中额外<a href="/tag/zengjia/" target="_blank" class="keywords">增加</a><a href="/tag/yige/" target="_blank" class="keywords">一个</a>c_ptr_id列且唯一:</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> C(models.Model):
nid </span>= models.AutoField(primary_key=<span style="color: #000000;">True)
part </span>= models.CharField(max_length=12<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> A(C):
id </span>= models.AutoField(primary_key=<span style="color: #000000;">True)
code </span>= models.CharField(max_length=1<span style="color: #000000;">)
ManyToManyField(RelatedField)
to,</span><span style="color: #008000;">#</span><span style="color: #008000;"> 要进行关联的表名</span>
related_name=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 在Admin或ModelForm中<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a>关联数据时,提供的条件:</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 如:</span>
- limit_choices_to={<span style="color: #800000;">'</span><span style="color: #800000;">nid__gt</span><span style="color: #800000;">'</span>: 5<span style="color: #000000;">}
</span>- limit_choices_to=<span style="color: #0000ff;">lambda</span> : {<span style="color: #800000;">'</span><span style="color: #800000;">nid__gt</span><span style="color: #800000;">'</span>: 5<span style="color: #000000;">}
</span><span style="color: #0000ff;">from</span> django.db.models <span style="color: #0000ff;">import</span><span style="color: #000000;"> Q
</span>- limit_choices_to=Q(nid__gt=10<span style="color: #000000;">)
</span>- limit_choices_to=Q(nid=8) | Q(nid__gt=10<span style="color: #000000;">)
</span>- limit_choices_to=<span style="color: #0000ff;">lambda</span> : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=<span style="color: #800000;">'</span><span style="color: #800000;">root</span><span style="color: #800000;">'</span><span style="color: #000000;">)
symmetrical</span>=None,<span style="color: #008000;">#</span><span style="color: #008000;"> 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 做如下操作时,不同的symmetrical会有不同的可选字段</span>
<span style="color: #000000;"> models.BB.objects.filter(...)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 可选字段有:code,id,m1</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> BB(models.Model):
code </span>= models.CharField(max_length=12<span style="color: #000000;">)
m1 </span>= models.ManyToManyField(<span style="color: #800000;">'</span><span style="color: #800000;">self</span><span style="color: #800000;">'</span>,symmetrical=<span style="color: #000000;">True)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 可选字段有: bb,code,symmetrical=<span style="color: #000000;">False)
through</span>=None,<span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>第三张表时,使用字段用于指定关系表</span>
through_fields=None,<span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>第三张表时,使用字段用于指定关系表中那些字段做多对多关系表</span>
<span style="color: #0000ff;">from</span> django.db <span style="color: #0000ff;">import</span><span style="color: #000000;"> models
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Person(models.Model):
name </span>= models.CharField(max_length=50<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Group(models.Model):
name </span>= models.CharField(max_length=128<span style="color: #000000;">)
members </span>=<span style="color: #000000;"> models.ManyToManyField(
Person,through</span>=<span style="color: #800000;">'</span><span style="color: #800000;">Membership</span><span style="color: #800000;">'</span><span style="color: #000000;">,through_fields</span>=(<span style="color: #800000;">'</span><span style="color: #800000;">group</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">person</span><span style="color: #800000;">'</span><span style="color: #000000;">),)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Membership(models.Model):
group </span>= models.ForeignKey(Group,on_delete=<span style="color: #000000;">models.CASCADE)
person </span>= models.ForeignKey(Person,on_delete=<span style="color: #000000;">models.CASCADE)
inviter </span>=<span style="color: #000000;"> models.ForeignKey(
Person,on_delete</span>=<span style="color: #000000;">models.CASCADE,related_name</span>=<span style="color: #800000;">"</span><span style="color: #800000;">membership_invites</span><span style="color: #800000;">"</span><span style="color: #000000;">,)
invite_reason </span>= models.CharField(max_length=64<span style="color: #000000;">)
db_constraint</span>=True,<span style="color: #008000;">#</span><span style="color: #008000;"> 是否在<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a>中创建外键约束</span>
db_table=None,<span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/mo/" target="_blank" class="keywords">默</a>认创建第三张表时,<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查询)
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、增、删、改、查
<span style="color: #008000;">#</span><span style="color: #008000;"> obj = models.Tb1(c1='xx',c2='oo')</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.save()</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 查</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> 删</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
<span style="color: #008000;">#</span><span style="color: #008000;"> 改</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a> **<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a></span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj = models.Tb1.objects.get(id=1)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.c1 = '111'</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.save() # <a href="/tag/xiugai/" target="_blank" class="keywords">修改</a>单条数据</span></pre>
3、排序、聚合
<span style="color: #008000;">#</span><span style="color: #008000;"> 大于,小于</span>
<span style="color: #008000;">#
<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(idlt=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;">#</span><span style="color: #008000;"> in</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> isnull</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> Entry.objects.filter(pub_date__isnull=True)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> contains</span>
<span style="color: #008000;">#
<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(nameicontains="ven") # icontains大小写不敏感
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(name__icontains="ven")
<span style="color: #008000;">#</span><span style="color: #008000;"> range</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__range=[1,2]) # 范围bettwen and
<span style="color: #008000;">#</span><span style="color: #008000;"> 其他类似</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> startswith,istartswith,endswith,iendswith,
<span style="color: #008000;">#</span><span style="color: #008000;"> order by</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> group by #当values后面是annotate时候,此时不在时<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>,而是分组</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> limit 、offset</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all()[10:20]
<span style="color: #008000;">#</span><span style="color: #008000;"> regex正则匹配,iregex 不区分大小写</span>
<span style="color: #008000;">#
<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(titleiregex=r'^(an?|the) +')
<span style="color: #008000;">#</span><span style="color: #008000;"> date</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> year</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> month</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> day</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> week_day</span>
<span style="color: #008000;">#
<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_dateweek_day__gte=2)
<span style="color: #008000;">#</span><span style="color: #008000;"> hour</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphour=23)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timehour=5)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphourgte=12)
<span style="color: #008000;">#</span><span style="color: #008000;"> minute</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminute=29)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timeminute=46)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminutegte=29)
<span style="color: #008000;">#</span><span style="color: #008000;"> second</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecond=31)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timesecond=2)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecondgte=31)
4、使用子查询和执行原生sql
<span style="color: #008000;">#</span><span style="color: #008000;"> F</span>
<span style="color: #008000;">#
<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;">#</span><span style="color: #008000;"> Q</span>
<span style="color: #008000;">#
<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(nidgt=10)
<span style="color: #008000;">#<span style="color: #008000;"> Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
<span style="color: #008000;">#</span><span style="color: #008000;"> 方式二:</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> con = Q()</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q1 = Q()</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q1.connector = 'OR'</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q1.children.append(('id',1))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q1.children.append(('id',10))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q1.children.append(('id',9))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q2 = Q()</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q2.connector = 'OR'</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q2.children.append(('c1',1))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q2.children.append(('c1',10))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> q2.children.append(('c1',9))</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> con.add(q1,'AND')</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> con.add(q2,'AND')</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(con)
<span style="color: #008000;">#</span><span style="color: #008000;"> 执行原生<a href="/tag/sql/" target="_blank" class="keywords">sql</a></span>
<span style="color: #008000;">#
<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对象方法详解
<span style="color: #0000ff;">def
<span style="color: #000000;"> all(self)<span style="color: #008000;">#<span style="color: #008000;"> 获取所有的数据对象
<span style="color: #0000ff;">def
filter(self,*args,**<span style="color: #000000;">kwargs)<span style="color: #008000;">#<span style="color: #008000;"> 条件查询
<span style="color: #008000;">#<span style="color: #008000;"> 条件可以是:参数,字典,Q
<span style="color: #0000ff;">def exclude(self,**<span style="color: #000000;">kwargs)
<span style="color: #008000;">#<span style="color: #008000;"> 条件查询
<span style="color: #008000;">#<span style="color: #008000;"> 条件可以是:参数,字典,Q
<span style="color: #0000ff;">def select_related(self,*<span style="color: #000000;">fields)
性能相关:跨表操作、表之间进行join连表操作,一次性获取关联的数据。
model.tb.objects.all().select_related()
model.tb.objects.all().select_related(<span style="color: #800000;">'<span style="color: #800000;">外键字段<span style="color: #800000;">') <span style="color: #008000;">#<span style="color: #008000;">多个外键使用","隔开
model.tb.objects.all().select_related(<span style="color: #800000;">'<span style="color: #800000;">外键字段__外键字段<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">def prefetch_related(self,*<span style="color: #000000;">lookups)
性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作,相当于把一次查询分开,先获取第一步的数据,在根据第一步数据再获取第二步数据,再把结果放在内存中
<span style="color: #008000;">#<span style="color: #008000;"> 获取所有用户表
<span style="color: #008000;">#<span style="color: #008000;"> 获取用户类型表where id in (用户表中的查到的所有用户ID)
models.UserInfo.objects.prefetch_related(<span style="color: #800000;">'<span style="color: #800000;">外键字段<span style="color: #800000;">'<span style="color: #000000;">)
</span><span style="color: #0000ff;">from</span> django.db.models <span style="color: #0000ff;">import</span><span style="color: #000000;"> Count,Case,When,IntegerField
Article.objects.annotate(
numviews</span>=<span style="color: #000000;">Count(Case(
When(readership__what_time__lt</span>=treshold,then=1<span style="color: #000000;">),output_field</span>=<span style="color: #000000;">CharField(),))
)
students </span>= Student.objects.all().annotate(num_excused_absences=<span style="color: #000000;">models.Sum(
models.Case(
models.When(absence__type</span>=<span style="color: #800000;">'</span><span style="color: #800000;">Excused</span><span style="color: #800000;">'</span>,default</span>=<span style="color: #000000;">0,output_field</span>=<span style="color: #000000;">models.IntegerField()
)))
<span style="color: #0000ff;">def annotate(self,**<span style="color: #000000;">kwargs)
<span style="color: #008000;">#<span style="color: #008000;"> 用于实现聚合group by查询
<span style="color: #0000ff;">from</span> django.db.models <span style="color: #0000ff;">import</span><span style="color: #000000;"> Count,Avg,Sum
v </span>= models.UserInfo.objects.values(<span style="color: #800000;">'</span><span style="color: #800000;">u_id</span><span style="color: #800000;">'</span>).annotate(uid=Count(<span style="color: #800000;">'</span><span style="color: #800000;">u_id</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> SELECT u_id,COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id</span>
<span style="color: #000000;">
v = models.UserInfo.objects.values(<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">').annotate(uid=Count(<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">')).filter(uid__gt=1<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> SELECT u_id,COUNT(ui_id) AS uid
FROM UserInfo GROUP BY u_id having count(u_id) > 1
<span style="color: #000000;">
v = models.UserInfo.objects.values(<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">').annotate(uid=Count(<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">',distinct=True)).filter(uid__gt=1<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> SELECT u_id,COUNT( DISTINCT ui_id) AS uid
FROM UserInfo GROUP BY u_id having count(u_id) > 1
<span style="color: #0000ff;">def distinct(self,*<span style="color: #000000;">field_names)
<span style="color: #008000;">#<span style="color: #008000;"> 用于distinct去重
models.UserInfo.objects.values(<span style="color: #800000;">'<span style="color: #800000;">nid<span style="color: #800000;">'<span style="color: #000000;">).distinct()
<span style="color: #008000;">#<span style="color: #008000;"> select distinct nid from userinfo
<span style="color: #000000;">
注:只有在Postgresql中才能使用distinct进行去重
<span style="color: #0000ff;">def order_by(self,*<span style="color: #000000;">field_names)
<span style="color: #008000;">#<span style="color: #008000;"> 用于排序
models.UserInfo.objects.all().order_by(<span style="color: #800000;">'<span style="color: #800000;">-id<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">def extra(self,select_params=<span style="color: #000000;">None)
<span style="color: #008000;">#<span style="color: #008000;"> 构造额外的查询条件或者映射,如:子查询
<span style="color: #000000;">
Entry.objects.extra(select={<span style="color: #800000;">'<span style="color: #800000;">new_id<span style="color: #800000;">': <span style="color: #800000;">"<span style="color: #800000;">select col from sometable where othercol > %s<span style="color: #800000;">"},select_params=(1<span style="color: #000000;">,))
Entry.objects.extra(where=[<span style="color: #800000;">'<span style="color: #800000;">headline=%s<span style="color: #800000;">'],params=[<span style="color: #800000;">'<span style="color: #800000;">Lennon<span style="color: #800000;">'<span style="color: #000000;">])
Entry.objects.extra(where=[<span style="color: #800000;">"<span style="color: #800000;">foo='a' OR bar = 'a'<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">baz = 'a'<span style="color: #800000;">"<span style="color: #000000;">])
Entry.objects.extra(select={<span style="color: #800000;">'<span style="color: #800000;">new_id<span style="color: #800000;">': <span style="color: #800000;">"<span style="color: #800000;">select id from tb where id > %s<span style="color: #800000;">"},order_by=[<span style="color: #800000;">'<span style="color: #800000;">-nid<span style="color: #800000;">'<span style="color: #000000;">])
<span style="color: #0000ff;">def<span style="color: #000000;"> reverse(self):
<span style="color: #008000;">#<span style="color: #008000;"> 倒序
models.UserInfo.objects.all().order_by(<span style="color: #800000;">'<span style="color: #800000;">-nid<span style="color: #800000;">'<span style="color: #000000;">).reverse()
<span style="color: #008000;">#<span style="color: #008000;"> 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
<span style="color: #0000ff;">def defer(self,*<span style="color: #000000;">fields):
models.UserInfo.objects.defer(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">'<span style="color: #000000;">)
或
models.UserInfo.objects.filter(...).defer(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',<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;">映射中排除某列数据
<span style="color: #0000ff;">def only(self,*<span style="color: #000000;">fields):
<span style="color: #008000;">#<span style="color: #008000;">仅取某个表中的数据
models.UserInfo.objects.only(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">'<span style="color: #000000;">)
或
models.UserInfo.objects.filter(...).only(<span style="color: #800000;">'<span style="color: #800000;">username<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> using(self,alias):
指定使用的数据库,参数为别名(setting中的设置)
<span style="color: #008000;">#<span style="color: #008000;">#################################################<span style="color: #008000;">
<span style="color: #008000;"> PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #<span style="color: #008000;">
<span style="color: #008000;">#################################################
<span style="color: #0000ff;">def raw(self,raw_query,translations=None,using=<span style="color: #000000;">None):
<span style="color: #008000;">#<span style="color: #008000;"> 执行原生sql
models.UserInfo.objects.raw(<span style="color: #800000;">'<span style="color: #800000;">select * from userinfo<span style="color: #800000;">'<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 如果<a href="/tag/sql/" target="_blank" class="keywords">sql</a>是其他表时,必须将名字设置为当前UserInfo对象的主键列名</span>
models.UserInfo.objects.raw(<span style="color: #800000;">'</span><span style="color: #800000;">select id as nid from 其他表</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 为原生<a href="/tag/sql/" target="_blank" class="keywords">sql</a>设置参数</span>
models.UserInfo.objects.raw(<span style="color: #800000;">'</span>@H_568_1<a href="/tag/404/" target="_blank" class="keywords">404</a>@<a href="/tag/s/" target="_blank" class="keywords">%s</a></span><span style="color: #800000;">'</span>,p<a href="/tag/ara/" target="_blank" class="keywords">ara</a>ms=[12<span style="color: #000000;">,])
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 将<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>的到列名转换为指定列名</span>
name_map = {<span style="color: #800000;">'</span><span style="color: #800000;">f<a href="/tag/irs/" target="_blank" class="keywords">irs</a>t</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">f<a href="/tag/irs/" target="_blank" class="keywords">irs</a>t_name</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">last</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">last_name</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">bd</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">birth_date</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">pk</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span><span style="color: #000000;">}
Person.objects.raw(</span><span style="color: #800000;">'</span><span style="color: #800000;">SELECT * FROM some_other_table</span><span style="color: #800000;">'</span>,translations=<span style="color: #000000;">name_map)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 指定<a href="/tag/shujuku/" target="_blank" class="keywords">数据库</a></span>
models.UserInfo.objects.raw(<span style="color: #800000;">'</span><span style="color: #800000;">select * from userinfo</span><span style="color: #800000;">'</span>,using=<span style="color: #800000;">"</span><span style="color: #800000;">default</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;">################## 原生<a href="/tag/sql/" target="_blank" class="keywords">sql</a> ###################</span>
<span style="color: #0000ff;">from</span> django.db <span style="color: #0000ff;">import</span><span style="color: #000000;"> connection,connections
cursor </span>= connection.cursor() <span style="color: #008000;">#</span><span style="color: #008000;"> cursor = connections['default'].cursor()</span>
cursor.execute(<span style="color: #800000;">"""</span><span style="color: #800000;">SELECT * from auth_user where id = <a href="/tag/s/" target="_blank" class="keywords">%s</a></span><span style="color: #800000;">"""</span>,[1<span style="color: #000000;">])
row </span>= cursor.fetchone() <span style="color: #008000;">#</span><span style="color: #008000;"> fetchall()/fetchmany(..)</span>
<span style="color: #0000ff;">def values(self,*<span style="color: #000000;">fields):
<span style="color: #008000;">#<span style="color: #008000;"> 获取每行数据为字典格式
<span style="color: #0000ff;">def values_list(self,*fields,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 获取每行数据为元祖
<span style="color: #0000ff;">def dates(self,field_name,kind,order=<span style="color: #800000;">'<span style="color: #800000;">ASC<span style="color: #800000;">'<span style="color: #000000;">):
<span style="color: #008000;">#<span style="color: #008000;"> 根据时间进行某一部分进行去重查找并截取指定内容
<span style="color: #008000;">#<span style="color: #008000;"> kind只能是:"year"(年),"month"(年-月),"day"(年-月-日)
<span style="color: #008000;">#<span style="color: #008000;"> order只能是:"ASC" "DESC"
<span style="color: #008000;">#<span style="color: #008000;"> 并获取转换后的时间
- year : 年-01-01
- month: 年-月-01
- day : 年-月-<span style="color: #000000;">日
models.DatePlus.objects.dates(</span><span style="color: #800000;">'</span><span style="color: #800000;">ctime</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">day</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">DESC</span><span style="color: #800000;">'</span><span style="color: #000000;">)
<span style="color: #0000ff;">def datetimes(self,order=<span style="color: #800000;">'<span style="color: #800000;">ASC<span style="color: #800000;">',tzinfo=<span style="color: #000000;">None):
<span style="color: #008000;">#<span style="color: #008000;"> 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
<span style="color: #008000;">#<span style="color: #008000;"> kind只能是 "year","month","day","hour","minute","second"
<span style="color: #008000;">#<span style="color: #008000;"> order只能是:"ASC" "DESC"
<span style="color: #008000;">#<span style="color: #008000;"> tzinfo时区对象,需要安装pytz
models.DDD.objects.datetimes(<span style="color: #800000;">'<span style="color: #800000;">ctime<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">hour<span style="color: #800000;">',tzinfo=<span style="color: #000000;">pytz.UTC)
models.DDD.objects.datetimes(<span style="color: #800000;">'<span style="color: #800000;">ctime<span style="color: #800000;">',tzinfo=pytz.timezone(<span style="color: #800000;">'<span style="color: #800000;">Asia/Shanghai<span style="color: #800000;">'<span style="color: #000000;">))
</span><span style="color: #800000;">"""</span><span style="color: #800000;">
pip3 install pytz
import pytz
pytz.all_timezo<a href="/tag/nes/" target="_blank" class="keywords">nes</a>
pytz.timezone(‘Asia/Shanghai’)
</span><span style="color: #800000;">"""</span>
<span style="color: #0000ff;">def<span style="color: #000000;"> none(self):
<span style="color: #008000;">#<span style="color: #008000;"> 空QuerySet对象
<span style="color: #008000;">#<span style="color: #008000;">###################################<span style="color: #008000;">
<span style="color: #008000;"> METHODS THAT DO DATABASE QUERIES #<span style="color: #008000;">
<span style="color: #008000;">###################################
<span style="color: #0000ff;">def aggregate(self,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 聚合函数,获取字典类型聚合结果
<span style="color: #0000ff;">from django.db.models <span style="color: #0000ff;">import<span style="color: #000000;"> Count,Sum
result = models.UserInfo.objects.aggregate(k=Count(<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">',distinct=True),n=Count(<span style="color: #800000;">'<span style="color: #800000;">nid<span style="color: #800000;">'<span style="color: #000000;">))
===> {<span style="color: #800000;">'<span style="color: #800000;">k<span style="color: #800000;">': 3,<span style="color: #800000;">'<span style="color: #800000;">n<span style="color: #800000;">': 4<span style="color: #000000;">}
<span style="color: #0000ff;">def<span style="color: #000000;"> count(self):
<span style="color: #008000;">#<span style="color: #008000;"> 获取个数
<span style="color: #0000ff;">def get(self,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 获取单个对象
<span style="color: #0000ff;">def create(self,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 创建对象
<span style="color: #0000ff;">def bulk_create(self,objs,batch_size=<span style="color: #000000;">None):
<span style="color: #008000;">#<span style="color: #008000;"> 批量插入
<span style="color: #008000;">#<span style="color: #008000;"> batch_size表示一次插入的个数
objs =<span style="color: #000000;"> [
models.DDD(name=<span style="color: #800000;">'<span style="color: #800000;">r11<span style="color: #800000;">'<span style="color: #000000;">),models.DDD(name=<span style="color: #800000;">'<span style="color: #800000;">r22<span style="color: #800000;">'<span style="color: #000000;">)
]
models.DDD.objects.bulk_create(objs,10<span style="color: #000000;">)
<span style="color: #0000ff;">def get_or_create(self,defaults=None,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 如果存在,则获取,否则,创建
<span style="color: #008000;">#<span style="color: #008000;"> defaults 指定创建时,其他字段的值
obj,created = models.UserInfo.objects.get_or_create(username=<span style="color: #800000;">'<span style="color: #800000;">root1<span style="color: #800000;">',defaults={<span style="color: #800000;">'<span style="color: #800000;">email<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">1111111<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">u_id<span style="color: #800000;">': 2,<span style="color: #800000;">'<span style="color: #800000;">t_id<span style="color: #800000;">': 2<span style="color: #000000;">})
<span style="color: #0000ff;">def update_or_create(self,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 如果存在,则更新,否则,创建
<span style="color: #008000;">#<span style="color: #008000;"> defaults 指定创建时或更新时的其他字段
obj,created = models.UserInfo.objects.update_or_create(username=<span style="color: #800000;">'<span style="color: #800000;">root1<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">t_id<span style="color: #800000;">': 1<span style="color: #000000;">})
<span style="color: #0000ff;">def<span style="color: #000000;"> first(self):
<span style="color: #008000;">#<span style="color: #008000;"> 获取第一个
<span style="color: #0000ff;">def<span style="color: #000000;"> last(self):
<span style="color: #008000;">#<span style="color: #008000;"> 获取最后一个
<span style="color: #0000ff;">def in_bulk(self,id_list=<span style="color: #000000;">None):
<span style="color: #008000;">#<span style="color: #008000;"> 根据主键ID进行查找
id_list = [11,21,31<span style="color: #000000;">]
models.DDD.objects.in_bulk(id_list)
<span style="color: #0000ff;">def<span style="color: #000000;"> delete(self):
<span style="color: #008000;">#<span style="color: #008000;"> 删除
<span style="color: #0000ff;">def update(self,**<span style="color: #000000;">kwargs):
<span style="color: #008000;">#<span style="color: #008000;"> 更新
<span style="color: #0000ff;">def<span style="color: #000000;"> exists(self):
<span style="color: #008000;">#<span style="color: #008000;"> 是否有结果
<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()进行验证,使用异常捕捉来进行处理
2、内置钩子
通过创建对象时,会执行顺序执行full_clean()-->clean_fields()-->clean(),我们可以自定义clean函数进行验证,其中clean_fields方法是字段正则验证
<span style="color: #0000ff;">def</span> clean(self): <span style="color: #008000;">#</span><span style="color: #008000;"><a href="/tag/zidingyi/" target="_blank" class="keywords">自定义</a>clean验证</span>
<span style="color: #0000ff;">from</span> django.core.exceptions <span style="color: #0000ff;">import</span><span style="color: #000000;"> ValidationError
c</span>=user.objects.filter(name=<span style="color: #000000;">self.name).count()
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> c:
</span><span style="color: #0000ff;">raise</span> ValidationError(message=<span style="color: #800000;">'</span><span style="color: #800000;"><a href="/tag/yonghuming/" target="_blank" class="keywords">用户名</a>已经存在</span><span style="color: #800000;">'</span>,code=<span style="color: #800000;">'</span><span style="color: #800000;">00</span><span style="color: #800000;">'</span>) <span style="color: #008000;">#</span><span style="color: #008000;">由于clean<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>捕获ValidationError,所以我们需要抛出该异常才能被捕获到</span>
</pre>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。