一、常用的models下的类
-
AutoField 自增列设置
一个根据实际ID自动增长的IntegerField
,用法nid = models.AutoField(primary_key=True)
-
BigAutoField自增列设置
一个64位整数,非常像[AutoField
]除了它保证适合1
到9223372036854775807
之间的数字
-
BigIntegerField
一个64位整数,非常像[IntegerField
]除了它保证适-9223372036854775808
到9223372036854775807
之间的数字
-
BooleanField true/false 字段
如果你需要设置[null
]值,则使用[NullBooleanField
]来代替BooleanField。如果[Field.default
]没有指定的话, BooleanField
的默认值是 None
。
t_boolean = models.BooleanField()
只能填写True 或者 Flase,否则会报错
models.T_Boolean.objects.create(t_boolean=True)
-
CharField用来储存字符串
class CharField(*max_length=None*, ***options*)[source]
一个用来存储从小到很大各种长度的字符串的地方,如果是巨大的文本类型, 可以用TextField
,注意CharField
必须接收一个额外的参数max_length
将在数据库层和Django表单验证中起作用, 用来限定字段的长度.它将会在渲染页面表单元素[Textarea
]时候体现出来, 但是并不会在model或者数据库级别强制性的限定字段长度。 请使用[CharField
]
-
TextField
class TextField(**options)
大文本字段。 该模型默认的表单组件是[Textarea
],如果你在这个字段类型中使用了max_length属性,
-
URLField
class URLField(max_length=200, **options)
一个[CharField
]类型的URL
这个字段默认的表单组件是一个[TextInput
]
-
TimeField时间字段
class TimeField(auto_now=False, auto_now_add=False, **options)
时间字段,和Python中 datetime.time
一样。 接受与[DateField
]相同的自动填充选项。
这个字段默认的表单组件是一个[TextInput
]. Admin添加一些JavaScript快捷方式。
-
DateField用来储存时间格式
日期格式 YYYY-MM-DD
对应的 python 函数 datetime.date
class DateField(auto_now=False, auto_now_add=False, **options)[source]
其中auto_now 和auto_now_add 不能同时设置,需要时可以两个字段分别设置
auto_now
-> 更新时,自动更新为当前时间 【变】
auto_now_add
-> 创建时,自动生成时间 【不变】
注:auto_now当直接调用update更新自动更新无效,需要用save
# obj = UserGroup.objects.filter(id=1).update(caption='CEO')
# obj = UserGroup.objects.filter(id=1).first()
# obj.caption = "CEO"
# obj.save()
-
DateTimeField用来储存时间格式
日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
对应的 python 函数 datetime.datetime
,参数使用同上
-
TimeField(DateTimeCheckMixin, Field)时间格式
时间格式 HH:MM[:ss[.uuuuuu]]
-
PositiveSmallIntegerField
该模型字段类似 [PositiveIntegerField
] 但是只允许小于某一特定值(依据数据库类型而定)。 从0
到 32767
这个区间,对于Django所支持的所有数据库而言都是安全的。
-
SmallIntegerField-32768 至 3276
该字段值在 -32768 至 32767这个范围内对所有可支持的数据库都是安全的。
-
PositiveIntegerField 0-2147483647整数
类似 [IntegerField
]( 但值必须是正数或者零(0
). 从0
到2147483647
的值在Django支持的所有数据库中都是安全的。 由于向后兼容性原因,接受值0
。
-
IntegerField整数
一个整数。 在Django所支持的所有数据库中,从 -2147483648 到 2147483647 范围内的值是合法的
-
DecimalField保存小数的
class DecimalField(max_digits=None, decimal_places=None, **options)
两个参数
max_digits:位数总数,包括小数点后的位数。 该值必须大于等于decimal_places
decimal_places:小数点后的数字数量
保存999.99实例
models.DecimalField(..., max_digits=5, decimal_places=2)
-
FloatField保存小数
用Python的一个float 实例来表示一个浮点数.
-
EmailField在admin中使用检查邮件格式
class EmailField(max_length=254, **options)
-
FileField 上传文件字段
class FileField(upload_to=None, max_length=100, **options)
参数upload_to:该属性提供设置上传目录和文件名的方式,可以通过两种方式进行设置
使用的时候在setting.py文件中设置好相关属性
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload/')
MEDIA_URL = '/upload/' #这个是在浏览器上访问该上传文件的url的前缀
设置保存格式三种方法
class MyModel(models.Model):
# 文件将上传到MEDIA_ROOT/uploads
upload = models.FileField(upload_to='uploads/')
class MyModel(models.Model):
# 文件将保存到MEDIA_ROOT/uploads/2015/01/30
upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
def user_directory_path(instance, filename):
# file will be uploaded to MEDIA_ROOT/user_/
return 'user_{0}/{1}'.format(instance.user.id, filename)
class MyModel(models.Model):
upload = models.FileField(upload_to=user_directory_path)
view展示
f = request.FILES.get('w')
obj = models.User.objects.create(avatar=f)
-
ImageField 图片路径
同上
ImageField(FileField)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)
-
FilePathField
FilePathField(Field)
- 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- 参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
-
GenericIPAddressField
- 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- 参数:
protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
二、字段选项
-
null 和 blank 属性
class Person(models.Model):
first_name = models.CharField(max_length=30,blank=True)
last_name = models.CharField(max_length=30,null=True)
null
如果为True,Django将在数据库中将空值存储为NULL。 默认值是 False。
blank
如果为True,则该字段允许为空白。 默认值是 False。
两者的区别在于当添加一个空值时,null在数据库显示为null,blank为空
#第一种
models.Person.objects.create(first_name="",last_name="")
#第二种
models.Person.objects.create()
上面的代码 所示,第一种情况两者在数据库中储存的都是空白字符,第二种分别null展示为null,blank为空白字符
-
choices 内存列表法
在不会变动数据类型中的值时,可以用choice,但仅限于admin
文章链接: https://www.jianshu.com/p/225fa408b810
-
db_column 改变字段名
当不想使用默认字段事使用db_column
属性
first_name = models.CharField(db_column="change_name",max_length=30,blank=True)
-
db_index
如果True
,将为该字段创建一个数据库索引
-
default 默认值
为字段设置默认值
-
editable
默认为TRUE,设置FLASE后字段不会出现在admin后台中
-
primary_key设置主键
若为 True, 则该字段会成为模型的主键字段,主键字段是只读的。 如果你改变了一个已存在对象上的主键并且保存的话,会创建一个新的对象,而不是覆盖旧的.
-
unique
如果为 True, 这个字段在表中必须有唯一值,primary_key=True
暗含着null=False,unique=True, 一个对象上只能拥有一个主键.
-
ForeignKey 一对多
创建两表互相关联ForeignKey('类名',to_field='字段')
from django.db import models
# Create your models here.
class city(models.Model):
uid = models.IntegerField(primary_key=True)
city_name = models.CharField(max_length=20)
class useInfos(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=26)
#和第一个表中的uid字段相互关联
user_city = models.ForeignKey('city',to_field='uid')
-
ManyToManyField多对多
创建一个新表
class HOST(models.Model):
uid = models.AutoField(primary_key=True)
host = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(max_length=32,db_index=True)
port = models.IntegerField()
b = models.ForeignKey('Business',to_field = 'id')
#在其中一个已知表中,生成一个连接表名当前类名_属性名
#Application_r
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField('HOST')
创建一个中间表
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self): # __unicode__ on Python 2
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __str__(self): # __unicode__ on Python 2
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)