概述
Python 模型是与数据库相关联的,每个属性都是数据库的表字段。既然是数据库相关的那必然存在一些属性,本篇博客就是介绍其基础属性以及用法。
简单使用
一般models都是在app下models.py中进行编写的,当然也可以新建自己的目录包进行创建:
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100, verbose_name='用户名')
psw = models.CharField(max_length=50, verbose_name='密码')
def __str__(self):
return self.name
接下来执行两条命令进行迁移到数据库:
准备:python manage.py makemigrations
执行:python manage.py migrate :
这样数据库表app_user就创建好了。如果想在Django自带的管理系统中看到需要到admin中进行注册,一下为简单注册示例:
from django.contrib import admin
from app.models import User
class UserAdmin(admin.ModelAdmin):
pass
admin.site.register(User, UserAdmin)
延伸扩展
很显然简单的使用肯定不满足日常使用,Django 为models提供了许多field 。
详情可见官网:Model field reference
Django提供了许多表字段类型:
'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField',
'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
'TimeField', 'URLField', 'UUIDField',
实际意义也比较好理解,特有类型Django内部还会校验合法性比如:URLField、IPAddressField、UUIDField。
Django提供了许多表字段属性
某些字段有自己的特有属性,而且还属于必填项,比如CharField必须声明长度。
常用属性介绍
-
null
如果是True,则运行为null,否则不允许,默认False -
blank
如果是True,则允许为null,否则不允许,默认False
注意:null的设置根数据库相关但是blank则是跟用户输入的表单验证有关,如果null设置了False blank 设置了True则会冲突报错。 -
choices
表单中的选择列表,列表、元组。每个元组的第一个元素是存储在数据库中的值,第二个元素是展示的显示值
choices=(('1', '实战课'), ('2', '免费课'), ('0', '其他'))
choices=(('1', '男'), ('2', '女'), ('0', '保密'))
官方example
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
]
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(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)
多级选择也是可以的:
MEDIA_CHOICES = [
('Audio', (
('vinyl', 'Vinyl'),
('cd', 'CD'),
)
),
('Video', (
('vhs', 'VHS Tape'),
('dvd', 'DVD'),
)
),
('unknown', 'Unknown'),
]
-
default
默认值 -
max_length
最大长度 -
db_column
如果不想使用Django自动生成的数据库表列名(app_model),可以使用这个属性信息自定义列名 -
db_index
True创建数据库索引,默认False -
editable
表单是否可编辑,如果设置成False,在Django管理页面上则看不到 -
error_messages
表单验证的错误提示 -
help_text
帮助、提示、说明 -
verbose_name
Django管理页面显示的属性对应的属性名 -
primary_key
如果您没有为模型中的任何字段指定primary_key=true,Django将自动添加一个autofield来保存主键,因此您不需要在任何字段上设置primary_key=true,除非您想覆盖默认的主键行为。有关更多信息,请参见自动主键字段。 -
unique
数据库唯一约束 -
unique_for_date
日期唯一 -
unique_for_month
月份唯一 -
validators
自定义数据验证,校验器
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
def validate_dis_range(value):
if value not in range(0, 101):
raise ValidationError(
_('%(value)s 范围必须是0-100'),
params={'value': value}
)
we_chat_dis = models.PositiveSmallIntegerField(default=100, verbose_name='微信折扣', help_text='0-100',
validators=[validate_dis_range])
- auto_now
Date相关的Field才有的属性,表示修改、新增才会自动生成的日期 - auto_now_add
Date相关的Field才有的属性,表示新增才会自动生成的日期
Meta
class Meta:
"""元数据:可对表信息进行修改"""
verbose_name = '线路信息'
verbose_name_plural = verbose_name
表之间的对应关系
一对一
OneToOneField
比如老师跟助教的关系,一个老师有一个助教(不接受抬杠)
助教表中添加
teacher = models.OneToOneField(Teacher, null=True, blank=True, on_delete=models.SET_NULL,
verbose_name='讲师') # on_delete=models.SET_NULL:一对一关系,级联关系为置空
一对多
ForeignKey
比如一个1们课程多个老师
课程表
teacher = models.ForeignKey(Teacher, null=Teacher, blank=True, on_delete=models.CASCADE,
verbose_name='课程教师') # 删除级联,多对一的关系
多对多
ManyToManyField
比如学生对课程
学生表
course = models.ManyToManyField(Course,verbose_name='课程') # 多对多