Django学习之字段类型

AutoField

一个自动增量,如果模型没有设置主键,会自动添加一个主键

id = models.AutoField( primary_key = True, db_column = "classifyID" )

BigIntegerField

整数类型,范围是-2^63~2^63,admin显示会用TextInput框

peopleNumber = models.BigIntegerField(verbose_name=u"人数")

BooleanField/NullBooleanField

一个True/False类型,admin默认使用CheckboxInput框,如果要使用null,使用NullBooleanField

isActivate = models.BooleanField( u"是否上架", db_column = u"isActivate" , default = True )

CharField

短字符串类型,如果有文字很多,使用TextField,admin显示使用TextInput框;

必填参数: 

max_length ---> 最大字节

name = models.CharField( u"应用名称", db_column = u"name", max_length = 64 )

CommaSeparatedInterField

逗号分隔的整数类型,相当于只能输入数字和逗号的CharField;

必填参数: 

max_length ---> 最大字节

price = models.CommaSeparatedIntegerField( verbose_name = u"价格", db_column = "price", max_length = 50 )

DateField/DateTimeField

日期类型,依赖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" )

DecimalField

十进制数据类型,等于是一个添加了十进制相关验证了CharField,admin为TextInput框

必填参数:

max_digits --->最多位数(包括小数). 

decimal_place ---> 小数位数 .

下面这种设置可以输入5位,其中小数点后2位

cost = models.DecimalField( verbose_name = u"消耗", db_column = "cost", max_digits = 5, decimal_places = 2 )

EmalField

用于验证email地址CharField类型

FileField

文件类型. 默认数据库创建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" )

FilePathField

文件路径类型.指定某个路径下的文件路径(不好理解哇)

必填参数:

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:该条理论上是这样的,但是验证时一个选项都没有,欢迎指正原因)

FloatField

浮点数类型.等于是一个添加了浮点数相关验证了CharField,admin为TextInput框

ImageField

图片上传类型.等于带了图片相关验证的FileField,需要PIL(Python Imaging Library)支持

额外可选参数:

height_field:自动保存时,图片的高度

width_field: 自动保存时,图片的宽度

IntegerField

整数类型.等于是一个添加了整数相关验证了CharField,admin为TextInput框

IPAddressField/GenericIPAddressField

IP地址(v4)/IP地址(v4和v6)类型.等于是一个添加了IP相关验证了CharField,admin为TextInput框

其中GenericIPAddressField的参数protocol默认为"both",表示既可以是ipv4协议,也可以是ipv6协议,其他选项有"IPv4","IPv6"

PositiveIntegerField/PositiveSmallIntergerField

类似整数类型,但是只允许自然数和0.其中PositiveSmallIntergerField的长度和数据库设置的字段长度有关

SlugField

一个新闻什么的类型.等于是带特殊验证的CharField,要求只能是字母,数字,下划线,估计是国外的什么特殊作用

SmallIntegerField

和整数类型相关,但是长度和数据库设置的字段长度有关

TextField

一个大文本,admin使用Textarea框

URLField

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时,外键数据的可选范围,等于是添加了一个过滤条件

未设置:

Django学习之字段类型_第1张图片

设置后:

Django学习之字段类型_第2张图片

relate_name: 用于关联数据表访问本表

a = StyleMap.objects.get( keycode = "1" )
print a.mybook.all()[0].name

结果为:233;如果不设置则会报错

to_field: 系统默认外键存关联数据的主键(即Book的style字段默认存StyleTable的keycode),使用这个可以修改外键存关联数据的列,上面代码修改为存keyvalue,注意,此时必须设置指定字段的unique=True,效果:

Django学习之字段类型_第3张图片

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))

ManyToManyField

用于描述多对多关系。本身会创建一个中间联系表来描述多对多关系。

关键参数:

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

暂时没用过

你可能感兴趣的:(Django学习之字段类型)