一个自动增量,如果模型没有设置主键,会自动添加一个主键
id = models.AutoField( primary_key = True, db_column = "classifyID" )
整数类型,范围是-2^63~2^63,admin显示会用TextInput框
peopleNumber = models.BigIntegerField(verbose_name=u"人数")
一个True/False类型,admin默认使用CheckboxInput框,如果要使用null,使用NullBooleanField
isActivate = models.BooleanField( u"是否上架", db_column = u"isActivate" , default = True )
短字符串类型,如果有文字很多,使用TextField,admin显示使用TextInput框;
必填参数:
max_length ---> 最大字节
name = models.CharField( u"应用名称", db_column = u"name", max_length = 64 )
逗号分隔的整数类型,相当于只能输入数字和逗号的CharField;
必填参数:
max_length ---> 最大字节
price = models.CommaSeparatedIntegerField( verbose_name = u"价格", db_column = "price", max_length = 50 )
日期类型,依赖python的datetime.date/datetime.datetime;admin界面显示为一个TextInput和一个js日历
关键参数:
auto_now ---> 每次操作(增加或修改)都会记录最后一次的时间
auto_now_add ---> 仅在创建时记录时间
lastDate = models.DateTimeField( verbose_name = u"最后修改时间", auto_now = True, db_column = u"lastDate" )
十进制数据类型,等于是一个添加了十进制相关验证了CharField,admin为TextInput框
必填参数:
max_digits --->最多位数(包括小数).
decimal_place ---> 小数位数 .
下面这种设置可以输入5位,其中小数点后2位
cost = models.DecimalField( verbose_name = u"消耗", db_column = "cost", max_digits = 5, decimal_places = 2 )
用于验证email地址CharField类型
文件类型. 默认数据库创建100字节的varchar,可以修改为max_length增加长度
保存路径: 由 settings里面的MEDIA_ROOT+参数upload_to(可以写成photos/%Y/%m/%d来添加时间分类)组合而成;
例如:MEDIA_ROOT="/home/media",upload_to为photos/%Y/%m/%d,那么实际保存路径为
/home/media/photos/2007/01/15
访问路径: 域名(IP)+settings里面的MEDITA_UTL+upload_to+上传文件名.例如:127.0.0.1:8000/media/bookdown/2014/06/测试文件.txt
download = models.FileField( verbose_name = u"下载路径", db_column = "download", upload_to = "bookdown/%Y/%m" )
文件路径类型.指定某个路径下的文件路径(不好理解哇)
必填参数:
path: 指定解析的文件夹路径
关键参数:
match: 正则表达式,用于匹配文件路径(测试发现不行)
recursive: 是否包括子文件夹,默认为True
例子:
filepathField = models.FilePathField( verbose_name = u"文件路径类型", \ path = u"C:\\Users\\jacksom\\Desktop\\TestServer", \ match = r".*", \ recursive = True, \ db_column = "filepathField" )
假设TestServer下有文件1.txt,2.txt,文件夹Images, 而Images文件夹下有a.png
此时admin下拉选择路径有三个选项,分别是: \1.txt,\2.txt,\Images\a.png
如果recursive=False,则不包括子文件夹,选项将变为\1.txt,\2.txt
如果match=r"Images.*",则选项为 \Images\a.png(PS:该条理论上是这样的,但是验证时一个选项都没有,欢迎指正原因)
浮点数类型.等于是一个添加了浮点数相关验证了CharField,admin为TextInput框
图片上传类型.等于带了图片相关验证的FileField,需要PIL(Python Imaging Library)支持
额外可选参数:
height_field:自动保存时,图片的高度
width_field: 自动保存时,图片的宽度
整数类型.等于是一个添加了整数相关验证了CharField,admin为TextInput框
IP地址(v4)/IP地址(v4和v6)类型.等于是一个添加了IP相关验证了CharField,admin为TextInput框
其中GenericIPAddressField的参数protocol默认为"both",表示既可以是ipv4协议,也可以是ipv6协议,其他选项有"IPv4","IPv6"
类似整数类型,但是只允许自然数和0.其中PositiveSmallIntergerField的长度和数据库设置的字段长度有关
一个新闻什么的类型.等于是带特殊验证的CharField,要求只能是字母,数字,下划线,估计是国外的什么特殊作用
和整数类型相关,但是长度和数据库设置的字段长度有关
一个大文本,admin使用Textarea框
URL类型,等于是带URL验证的CharField,默认200长度
>>>>>>>>>>>>
ForeignKey
用于描述多对一关系,第一个参数必须是关联对象(PS:可以使用字符串来表示不再同一个模块的对象)
举个例子方便描述
#models.py class StyleMap( models.Model ): """ @attention: 类型映射表 """ keycode = models.CharField( u'类型代码', primary_key = True, max_length = 4, db_column = u"code" ) keyvalue = models.CharField( u'风格类型', max_length = 50, db_column = u"value", unique = True ) class Meta: db_table = u"StyleMap" verbose_name = verbose_name_plural = u"类型映射表" def __unicode__( self ): return unicode( self.keyvalue ) class Book( models.Model ): name = models.CharField( verbose_name = u"书名", db_column = "name" , max_length = 50 ) style = models.ForeignKey( "StyleMap", limit_choices_to = {"keycode__in":["1", "2"]}, \ related_name = "mybook", to_field = "keyvalue", null = True, on_delete = models.SET_NULL ) class Meta: db_table = u"Book" verbose_name = verbose_name_plural = u"图书表" def __unicode__( self ): return unicode( self.name ) #admin.py from django.contrib import admin from models import Book, StyleMap for i in xrange( 5 ): obj = StyleMap( keycode = str( i ), keyvalue = u"风格%s" % i ) obj.save() class BookAdmin( admin.ModelAdmin ): radio_fields = {"style":admin.HORIZONTAL} admin.site.register( Book, BookAdmin ) admin.site.register( StyleMap )
关键参数:
limit_choices_to: 用于限制admin或ModelForm时,外键数据的可选范围,等于是添加了一个过滤条件
未设置:
设置后:
relate_name: 用于关联数据表访问本表
a = StyleMap.objects.get( keycode = "1" ) print a.mybook.all()[0].name
结果为:233;如果不设置则会报错
to_field: 系统默认外键存关联数据的主键(即Book的style字段默认存StyleTable的keycode),使用这个可以修改外键存关联数据的列,上面代码修改为存keyvalue,注意,此时必须设置指定字段的unique=True,效果:
on_delete: 删除外键数据时,本表数据的情况
>>models.CASCADE: 级联删除(默认情况)。删除外键数据时,使用该外键数据的所有数据也会删除(即如果删除StyleTable中keycode等于1的数据时,会同时删除Book表中name为233那条数据)
>>models.SET_NULL:删除外键时,关联数据的外键ID会修正为null,前提是外键必须设置属性 blank=True,null=True
>>models.PROTECT: 删除外建时,如果关联数据还存在,则会报错
>> models.SET_DEFAULT:删除外键时,关联数据会修改为默认值,前提是外键必须设置default=xx
>>models.SET():会填充设置的内容(这个没验证过),给个官网的例子
def get_sentinel_user(): return User.objects.get_or_create(username='deleted')[0]class MyModel(models.Model): user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))
用于描述多对多关系。本身会创建一个中间联系表来描述多对多关系。
关键参数:
limit_choices_to:同外键
related_name: 同外键
db_table: 用于设置中间联系表的名称,默认是基于两个表的链接名字
through: 指明一个存在的中间联系表,该表必须把两个基本表作为外键。一般用于中间联系表需要设置额外字段的时候
class Subject2App( models.Model ): """ @attention: 专题和应用多对多中间表 """ app = models.ForeignKey( AppBaseInfoTable, verbose_name = u"应用信息", db_column = "appID" ) subject = models.ForeignKey( SubjectTable, verbose_name = u"专题信息", db_column = "subjectID" ) weight = models.PositiveIntegerField( u"权重", db_column = u"weight" , max_length = 10, default = 1 ) class Meta: db_table = "Subject2AppTable" verbose_name = verbose_name_plural = u"专题和应用中间表" def __unicode__( self ): return u"%s - %s" % ( self.subject.name, self.app.name )
OneToOneField
暂时没用过