前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django模型最佳实践

Django模型最佳实践

原创
作者头像
用户8442333
修改2021-05-20 14:39:47
2.2K0
修改2021-05-20 14:39:47
举报
文章被收录于专栏:python知识python知识
  1. 正确的模型命名和关系字段命名。
  2. 设置适当的related_name属性。
  3. OneToOneField代替ForeignKeyField(unique=True)
  4. 通过“迁移操作”(migrate)来添加模型。
  5. 用NoSQL来应对需要降低范式级别的场景。
  6. 如果布尔类型可以为空要使用NullBooleanField
  7. 在模型中放置业务逻辑。
  8. <ModelName>.DoesNotExists取代ObjectDoesNotExists
  9. 在数据库中不要出现无效数据。
  10. 不要对QuerySet调用len()函数。
  11. QuerySetexists()方法的返回值用于if条件。
  12. DecimalField来存储货币相关数据而不是FloatField
  13. 定义__str__方法。
  14. 不要将数据文件放在同一个目录中。

模型定义参考

字段

对字段名称的限制

  • 字段名不能是Python的保留字,否则会导致语法错误
  • 字段名不能有多个连续下划线,否则影响ORM查询操作

Django模型字段类

字段类

说明

AutoField

自增ID字段

BigIntegerField

64位有符号整数

BinaryField

存储二进制数据的字段,对应Python的bytes类型

BooleanField

存储True或False

CharField

长度较小的字符串

DateField

存储日期,有auto_now和auto_now_add属性

DateTimeField

存储日期和日期,两个附加属性同上

DecimalField

存储固定精度小数,有max_digits(有效位数)和decimal_places(小数点后面)两个必要的参数

DurationField

存储时间跨度

EmailField

与CharField相同,可以用EmailValidator验证

FileField

文件上传字段

FloatField

存储浮点数

ImageField

其他同FileFiled,要验证上传的是不是有效图像

IntegerField

存储32位有符号整数。

GenericIPAddressField

存储IPv4或IPv6地址

NullBooleanField

存储True、False或null值

PositiveIntegerField

存储无符号整数(只能存储正数)

SlugField

存储slug(简短标注)

SmallIntegerField

存储16位有符号整数

TextField

存储数据量较大的文本

TimeField

存储时间

URLField

存储URL的CharField

UUIDField

存储全局唯一标识符

字段属性

通用字段属性

选项

说明

null

数据库中对应的字段是否允许为NULL,默认为False

blank

后台模型管理验证数据时,是否允许为NULL,默认为False

choices

设定字段的选项,各元组中的第一个值是设置在模型上的值,第二值是人类可读的值

db_column

字段对应到数据库表中的列名,未指定时直接使用字段的名称

db_index

设置为True时将在该字段创建索引

db_tablespace

为有索引的字段设置使用的表空间,默认为DEFAULT_INDEX_TABLESPACE

default

字段的默认值

editable

字段在后台模型管理或ModelForm中是否显示,默认为True

error_messages

设定字段抛出异常时的默认消息的字典,其中的键包括null、blank、invalid、invalid_choice、unique和unique_for_date

help_text

表单小组件旁边显示的额外的帮助文本。

primary_key

将字段指定为模型的主键,未指定时会自动添加AutoField用于主键,只读。

unique

设置为True时,表中字段的值必须是唯一的

verbose_name

字段在后台模型管理显示的名称,未指定时使用字段的名称

ForeignKey属性

  1. limit_choices_to:值是一个Q对象或返回一个Q对象,用于限制后台显示哪些对象。
  2. related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。
  3. to_field:指定关联的字段,默认关联对象的主键字段。
  4. db_constraint:是否为外键创建约束,默认值为True。
  5. on_delete:外键关联的对象被删除时对应的动作,可取的值包括django.db.models中定义的:
    • CASCADE:级联删除。
    • PROTECT:抛出ProtectedError异常,阻止删除引用的对象。
    • SET_NULL:把外键设置为null,当null属性被设置为True时才能这么做。
    • SET_DEFAULT:把外键设置为默认值,提供了默认值才能这么做。

ManyToManyField属性

  1. symmetrical:是否建立对称的多对多关系。
  2. through:指定维持多对多关系的中间表的Django模型。
  3. throughfields:定义了中间模型时可以指定建立多对多关系的字段。
  4. db_table:指定维持多对多关系的中间表的表名。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模型定义参考
    • 字段
      • 字段属性
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档