Django models Fild详解

本文参考自:django官方文档models/field

在model中添加字段的格式一般为:  field_name = field_type(**field_options)

 

一  field options(所有字段共用)

  1  null   默认为False,True则表示可以为null。(空字符串在数据库中可能被存储为'')

  2  blank  默认为False,True表示可以为空。

  3  choice  可选的,限制了该选项的字段值必须是所指定的choice中的一个。

复制代码
from django.db import modelsclass Student(models.Model):FRESHMAN = 'FR'SOPHOMORE = 'SO'JUNIOR = 'JR'SENIOR = 'SR'YEAR_IN_SCHOOL_CHOICES = ((FRESHMAN, 'Freshman'),      #第一个参数是真正的model参数,#第二个参数则是方便人们理解阅读(SOPHOMORE, 'Sophomore'),(JUNIOR, 'Junior'),(SENIOR, 'Senior'),)year_in_school = models.CharField(max_length=2,choices=YEAR_IN_SCHOOL_CHOICES,default=FRESHMAN,)def is_upperclass(self):return self.year_in_school in (self.JUNIOR, self.SENIOR)
复制代码
View Code

   4  db_column  数据库column名称。默认为本字段的名称。

  5  db_index  如果为True的话,该字段的数据库索引将会被创建

  6  default   设置该字段的默认值,可以是值也可以是对象。

  7  editable   默认为True,若为False,则不会在admin/界面显示

  8  primary_key  若设置为True,则表示将该字段设置为主键。一般情况下django默认会设置一个自增长的id主键。

  9  unique   若设置为True,该字段值不可重复

二  field type(字段类型,细分的话可以分为普通字段以及关系字段)

 1  普通字段

  1  AutoField()  根据已有id自增长的整形唯一字段,一般每个model类不需设置该字段,因为django会为每个model自动设置。

    django默认会为每个model类添加如下语句:id = models.AutoField(primary_key=True)  当其他字段添加了primary_key属性,则不会创建id字段了

    每个model类仅能有一个主键

  2  BooleanField()  布尔型字段,默认的表单窗口部件是CheckBoxInput

  3  CharField()  字符型字段,默认的表单窗口部件是TextInput。该字段类型有一个必需参数:max_length  在数据库水平限定了字符串最大长度

  4  DateField()  日期字段,字段的值是python中datetime.date的实例,默认的表单窗口是TextInput有几个可选的参数:

    auto_now=True/False:当设置为True时,每当该对象使用save()时,该字段的值就会被更新。

    auto_now_add=True/False: 当设置为True时,该字段的值为该对象被创建时的日期

  5  DateTimeField()  日期和时间字段,值为datetime.datetime实例。默认的表单窗口以及可选参数同上。

  6  DecimalField()  混合精度的小数型数字字段。有两个必需的参数:

    max_digits=ingt_number:限定数字的最大位数(包含小数位)

    decimal_places=int_number:存储数字的小数位

#to store numbers up to 999 with a resolution of 2 decimal places, you’d use
models.DecimalField(..., max_digits=5, decimal_places=2)

   7  EmailField(max_length=254, **options)  邮件字段,使用EmailValidator进行验证

  8  FileField(upload_to=None, max_length=100, **options)  文件上传字段。

  这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.

  有两个可选参数:

    upload_to

      如果使用默认的FileSystomStorage,文件将会存储到settings文件中配置的MEDIA_ROOT路径中。

      upload_to的值也可以为可调用对象,通过调用这个对象可以获得上传路径。

        instance=:  定义了FileField的模型实例

        filename='':  文件名称。

class MyModel01(models.Model):# file will be uploaded to MEDIA_ROOT/uploadsupload = models.FileField(upload_to='uploads/')# or...# file will be saved to MEDIA_ROOT/uploads/2015/01/30upload = models.FileField(upload_to='uploads/%Y/%m/%d/')#upload_to=可调用对象
def user_directory_path(instance, filename):# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>return 'user_{0}/{1}'.format(instance.user.id, filename)class MyModel02(models.Model):upload = models.FileField(upload_to=user_directory_path)
实例

    storage  用来设定文件存储仓库    

  9  FilePathField(path=None, match=None, recursive=False, max_length=100, **options)

    这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数

    path='':  该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".

    match='pattern':  可选参数。格式是正则表达式。用来拣选符合匹配正则表达式的文件

    recursive=True/False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件。    

FilePathField(path="/home/images", match="foo.*", recursive=True)

  10  FloatField()  浮点字段,默认的表单窗口部件是NumberInput。和DecimalField经常混淆不清,

    FloatField在内部使用Python中的float对象,而DecimalField在内部使用Python中的decimal对象。

  11  ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options

    图像字段。继承了FileField的所有属性和方法。而且还能自动验证上传的对象是否为合法的图像。

  12  IntegerField  整形字段。

  13  GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)  ip地址字段

    protocol='both/ipv4/ipv6'  默认为both

    unpack_ipv4   用处不大。

  14  NullBooleanField  类似于BooleanField,不同的是其允许值为null

  15  TextField()   与CharField类似,但一般用来存储体积较大的文本。

  16  TimeField(auto_now=False, auto_now_add=False, **options)   时间字段,其值为datetime.time实例

  17  URLField(max_length=200, **options)    URL字段

    类似于CharField的子类,默认最大长度为200.

  18  UUIDField(**options)  通用唯一标识字段,当不想用django默认设置的AutoField字段时,可以用该字段代替。

 

  2  关系字段

  关系字段:一对一,多对一,多对多

  一对一:  现在有很多一对一辅导班,也就是上课时,一个老师对应一个学生,一个学生对应一个老师

  多对一:  很多偏远山区的学校可能整个学校只有一个老师,这一个老师对应多个学生,所有的学生对应这一个老师

  多对多:  而我们则很幸福,学校里有许多老师,一个老师教习一科,学生有多个老师,老师有多个学生。

  1  ForeignKey(othermodel, on_delete, **options)  多对一或者一对多或者外键字段。

    othermodel:  所关联的模型,'多' model使用外键关联  '一'model。

      当所关联的模型为他自己时,使用'self'

      当引用的模型为其他app中的模型时,要加上app名称标签:  'app_name.model_name'

      数据库会自动在外键字段上创建索引,可以使用de_index=False关闭该功能。

    on_delete: 当删除 "一" 模型对象时,django会根据该参数的值对与该对象相关联的其他对象(也就是 ‘多’)进行操作。

        在django1.9以及之前的版本中,on_delete作为一个关键字参数。而在1.10则可以作为第二个参数

      models.CASCADE:   默认为models.CASCADE   级联删除。当删除'一'时,‘多’会被删除。比如:

# mysite项目下名为polls的app中的models.py
class follower(models.Model):name = models.CharField(max_length=200)menpai = models.ForeignKey('menpai', on_delete=models.CASCADE)  #定义了models.CASCADE属性def __str__(self):return self.nameclass menpai(models.Model):name = models.CharField(max_length=200)def __str__(self):return self.name#运行 python3 manager.py shell进入交互页面
>>> from polls.models import follower,menpai
>>> m1=menpai(name='huashanpai')   
>>> m1.save()
>>> m2=menpai(name='riyuejiao')
>>> m2.save()
>>> f1=follower(name='linghuchong',menpai=m1)
>>> f1.save()
>>> f2=follower(name='renwoxing',menpai=m2)
>>> f2.save()
>>> f1.menpai
<menpai: huashanpai>
>>> m1.delete()
(2, {'polls.menpai': 1, 'polls.follower': 1})   # 删除华山派时,将令狐冲也删除了
View Code

      modles.PROTECT :    当删除一个具有外键关系的对象时,会引发一个异常,阻止删除该对象

      models.SET_NULL:   设置删除对象所关联的外键字段为null。但字段的null属性必需为True

      models.SET_DEFAULT :    设置删除对象所关联的外键字段为默认的值。

      models.SET(value)  :设置删除对象所关联的对象的外键字段为value,value也可以是一个可调用函数。

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import modelsdef get_sentinel_user():return get_user_model().objects.get_or_create(username='deleted')[0]class MyModel(models.Model):user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET(get_sentinel_user),)
models.SET()实例

      models.DO_NOTHING :  不做任何操作

    limit_choices_to  限制该字段为选项形。格式:limit_choices_to={'is_staff': True}。值也可以为可调用函数。

def limit_pub_date_choices():return {'pub_date__lte': datetime.date.utcnow()}limit_choices_to = limit_pub_date_choices
实例

    related_name  设置从关联对象到自身的关系的名称,若值为'+'  则关联对象与自身无逆向关系。详解请看官方文档。

    to_field  设置所关联对象的关联字段。默认为关联对象的主键字段。

    

  2  ManyToManyField(othermodel, **options)  多对多字段。

    othermodel:  所关联的model名称

    db_table:  多对多关系会在两个模型所对应的表中间创建一个‘中间表’ ,将多对多转换为两个多对一,该选项为这个中间表设置名称。一般来说django会默认为中间表创建名称,但人们读起来可能搞不清楚究竟中间表关联到了哪里。

    related_name:  同多对一字段中的related_name

    limite_choices_to:  同....

    symmetrical:  当多对多关联对象为自身时可能会用到的参数。默认为True。a,b同属于person模型,person中的friends字段与自身设置了多对多关系,当该值设置为True时,django假定关系为对称,即:a是b的朋友,那么b也是a的朋友。设置为False时,django会强制为逆向关系创建描述信息。

    though:  不想让django自动创建中间表,手动创建中间表所对应的model,通过though指定对应的model名称。

    though_field:  当though参数被使用时,该参数才会有效。指定使用哪些中间模型字段来确立两个模型的多对多关系。

  3  OneToOneField(othermodel, on_delete, parent_link=False, **options)  一对一字段。

    othermodel: .......

    on_delete:........

    related_name:...........

转载于:https://www.cnblogs.com/jiaojianglong/p/6595713.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8737.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQlite3(轻型数据库)

1. main.m文件 #import <Foundation/Foundation.h> #import "SQLManger.h"int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...NSLog("Hello, World!");SQLManger* sql [SQLManger shareSqlManger];[sql createTab…

我和ChatGPT聊了聊:它承认自己没有人性

我认为ChatGPT未来也许可以取代那些 重复 可以模板 固定公式 运作的工作 但是很难取代 定制化 人性化的工作 最近ChatGPT太火了&#xff0c;已经从好几个不同的渠道接触到了它&#xff0c;自然是整了一个去玩玩&#xff0c;零零散散问了它一些问题&#xff0c;答案还挺有意思的…

有了ChatGPT,还需要操作系统吗?|CCF C³

杨净 发自 凹非寺量子位 | 公众号 QbitAI 大模型引领的AI 2.0&#xff0c;远比想象来得更加猛烈。 尤其是被认为最先被颠覆的搜索引擎领域&#xff0c;产学研界都蠢蠢欲动&#xff0c;对可预见的趋势展开激辩。 没有了用户点击&#xff0c;内容提供商/广告该怎么办&#xff1f;…

震惊!外国小哥用ChatGPT完成80%工作,同时打4份工

【导读】自从ChatGPT火了以后&#xff0c;办公室白领可真是爽翻了。甭管什么任务&#xff0c;交给ChatGPT&#xff0c;准没错。 不少白领在工作中都用上了ChatGPT&#xff0c;堪称如虎添翼。 毕竟&#xff0c;很多工作都是重复的、有章可循的。 既然有了科技力量的加持&#xf…

ChatGPT会对未来5年的NLP算法从业者带来怎样的冲击?

周末看到知乎的一个问题&#xff0c;有点意思&#xff0c;值得NLPer思考&#xff0c;选取几个回答&#xff0c;欢迎留言。 问题&#xff1a;ChatGPT的诞生意味着模型大一统的可行性&#xff0c;这会对未来5年的NLP算法从业者带来怎样的冲击&#xff1f; 我个人从ChatGPT上看到了…

OpenAI 账户验证流程存在漏洞,可导致用户无限薅羊毛

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 Checkmarx 公司指出&#xff0c;OpenAI 的账户验证流程中存在一个漏洞&#xff0c;可导致任何人使用同一个电话号码注册新账户后&#xff0c;获得无限制的服务额度。 作为人工智能公司&…

赚翻了!外国小哥用ChatGPT完成80%工作,同时打4份工

Datawhale分享 最新&#xff1a;ChatGPT应用&#xff0c;编辑&#xff1a;新智元 【导读】自从ChatGPT火了以后&#xff0c;办公室白领可真是爽翻了。甭管什么任务&#xff0c;交给ChatGPT&#xff0c;准没错。 不少白领在工作中都用上了ChatGPT&#xff0c;堪称如虎添翼。 毕…

ShardingJDBC读写分离

ShardingJDBC是什么 看一看ChatGPT对他的解释&#xff1a; ShardingJDBC是一个数据库连接池&#xff0c;它为数据库的分片和读/写拆分提供支持。它允许您跨多个物理数据库和服务器分发数据&#xff0c;并根据设置的配置将读写操作路由到适当的数据库。 以下是它的工作原理&…

为什么总是闹离职的员工没走,平时不吭声的员工却突然离职?

上一篇&#xff1a;华为“天才少年”稚晖君被曝离职&#xff01;两年前加入年薪百万起步的天才少年计划&#xff01; 相信工作过几年的朋友都遇到过类似的现象&#xff1a;总是闹离职的员工没走&#xff0c;平时不吭声的员工却突然离职。 其实很正常&#xff0c;总是闹离职的说…

盘点海外 AIGC 独角兽创始人,中国何时迎来自己的高光时刻?

据不完全统计&#xff0c;全球 AIGC 创业公司中估值在 10 亿美元以上的已经多达 10 家。包括推出 ChatGPT 的 OpenAI&#xff0c;因《太空歌剧院》而走红的 Midjourney 等。这些独角兽背后的创业者都是谁&#xff1f;他们又是如何成为时代的开创者&#xff1f;本篇文章带你一看…

适合程序员使用的 ChatGPT!!!

ChatGPT 不仅能解决亲情&#xff0c;友情&#xff0c;爱情等非常热门的问题&#xff0c;还能帮助程序员在开发中反复测试自己的代码或者切磋技艺。 例如&#xff0c;作为程序员的我们&#xff0c;只要在ChatGPT上轻轻松松地输出我们的需求&#xff0c;“null pointer怎么解决啊…

1 分钟高效集成 ChatGPT,Stable Diffusion 等 AIGC 模型最强教程

1 分钟能做什么&#xff1f;集成 ChatGPT 到自己的公众号&#xff0c;小程序或者 APP&#xff1f;集成各种形式的 Stable Diffusion&#xff0c;让 AIGC 帮助自己的项目更有趣&#xff0c;更生动&#xff1f;本教程将会教大家如何 1 分钟高效集成 ChatGPT&#xff0c;Stable Di…

【起飞】让你电脑速度快到飞起的一些牛逼的设置整理【电脑卡顿反应慢等问题解决】

对于开发来说电脑的反应速度简直影响了思维的速度&#xff0c;要让电脑速度跟上我们的思维&#xff0c;提高工作效率&#xff0c;早点打卡下班回家陪老婆孩子哈哈 这篇文章主要对windows系统做的一些优化&#xff0c;是真的好用&#xff0c;仿佛在访问静态页面一样&#xff0c;…

【Redis】孔夫子旧书网爬虫接入芝麻代理IP:代理IP利用效率最大化

背景&#xff1a; 之前用过芝麻IP&#xff0c;写过这几篇文章 《【Python】芝麻HTTP代理系列保姆级全套攻略(对接教程自动领取每日IPIP最优算法)》 《【Python】记录抓包分析自动领取芝麻HTTP每日免费IP&#xff08;成品教程&#xff09;》 《爬虫增加代理池&#xff1a;使用稳…

高通410 随身WIFI刷入Debian系统(玩法合集)

引言 刚接触到这个项目是在b站上&#xff0c;刷到一位UP主的视频&#xff1a;https://b23.tv/xAFWiTF 其实现了在搭载高通410芯片的随身WIFI烧录linux系统&#xff0c;并在上面部署了chatGPT-Next网站服务。 本人参考的教程链接和其教程所有工具&#xff1a;https://pan.bai…

chatgpt赋能python:Python如何薅羊毛?

Python如何薅羊毛&#xff1f; 近年来&#xff0c;Python已经成为了越来越多程序员的首选编程语言。除了在技术领域得到广泛应用&#xff0c;Python还可以被用于一些非正当途径&#xff0c;比如薅羊毛。在这篇文章中&#xff0c;我们将会学习如何利用Python来薅羊毛。 什么是…

【ChatGPT】GPT实现原理大解析——看完就知道什么叫颠覆

文章目录 前言一、ChatGPT是什么&#xff1f;二、那么&#xff0c;如何计算下一个单词的概率&#xff1f;三&#xff0c; 什么是模型&#xff1f;四&#xff0c;如何制作能完成人类任务的模型五&#xff0c;神经网络总结 前言 ChatGPT 能够自动生成类似于人类写作的文本&#…

多平台发布文章怎么做?自媒体多平台发内容教程分享

目前很多小伙伴着手做自媒体全部都是在一些自媒体视频或是时尚博主的推荐下才了解到做自媒体可以为自己创造收入&#xff0c;刚开始做得时候或许只是会弄两三个账户&#xff0c;察觉收入也并不高&#xff0c;便不愿意去做相应的事情了&#xff0c;确实目前做自媒体的人太多了&a…

自媒体文章同步该怎么做?有什么办法可以一键同步到多自媒体平台

在自媒体行业当中&#xff0c;有很多人的苦恼就是应该如何将自己的创作内容同时发布在各大媒体上&#xff0c;应该进行什么样的步骤才能够进行同步。那我们需要在各大平台进行授权&#xff0c;才能够进行同时发布&#xff0c;不仅非常的繁琐&#xff0c;而且在管理账户方面更容…

自媒体一篇文章能多平台发布吗?

如今是全民自媒体时代&#xff0c;只要热爱创作&#xff0c;并且懂得网络知识的人们&#xff0c;就可以成为自媒体人&#xff0c;自媒体这个行业存在竞争&#xff0c;能否在竞争中脱引而出&#xff0c;能否利用自媒体平台赚钱&#xff0c;与个人眼光、写作水平以及所用工具存在…