zoukankan      html  css  js  c++  java
  • 字段的参数 -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程

    所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址。


    所有的模型字段都可以接收一定数量的参数,比如CharField至少需要一个max_length参数。下面的这些参数是所有字段都可以使用的,并且是可选的。

    null

    该值为True时,Django在数据库用NULL保存空值。默认值为False。对于保存字符串类型数据的字段,请尽量避免将此参数设为True,那样会导致两种‘没有数据’的情况,一种是NULL,另一种是‘空字符串’。

    blank

    True时,字段可以为空。默认False。和null参数不同的是,null是纯数据库层面的,而blank是验证相关的,它与表单验证是否允许输入框内为空有关,与数据库无关。所以要小心一个null为False,blank为True的字段接收到一个空值可能会出bug或异常。

    choices

    用于页面上的选择框标签,需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容。在浏览器页面上将显示第二个元素的值。例如:

        YEAR_IN_SCHOOL_CHOICES = (
            ('FR', 'Freshman'),
            ('SO', 'Sophomore'),
            ('JR', 'Junior'),
            ('SR', 'Senior'),
            ('GR', 'Graduate'),
        )
    

    一般来说,最好将选项定义在类里,并取一个直观的名字,如下所示:

    from django.db import models
    
    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)
    

    要获取一个choices的第二元素的值,可以使用get_FOO_display()方法,其中的FOO用字段名代替。对于下面的例子:

    from django.db import models
    
    class Person(models.Model):
        SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
        )
        name = models.CharField(max_length=60)
        shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
    

    使用方法:

    >>> p = Person(name="Fred Flintstone", shirt_size="L")
    >>> p.save()
    >>> p.shirt_size
    'L'
    >>> p.get_shirt_size_display()
    'Large'
    

    db_column

    该参数用于定义当前字段在数据表内的列名。如果未指定,Django将使用字段名作为列名。

    db_index

    该参数接收布尔值。如果为True,数据库将为该字段创建索引。

    db_tablespace

    用于字段索引的数据库表空间的名字,前提是当前字段设置了索引。默认值为工程的DEFAULT_INDEX_TABLESPACE设置。如果使用的数据库不支持表空间,该参数会被忽略。

    default

    字段的默认值,可以是值或者一个可调用对象。如果是可调用对象,那么每次创建新对象时都会调用。设置的默认值不能是一个可变对象,比如列表、集合等等。lambda匿名函数也不可用于default的调用对象,因为匿名函数不能被migrations序列化。

    注意:在某种原因不明的情况下将default设置为None,可能会引发intergyerror:not null constraint failed,即非空约束失败异常,导致python manage.py migrate失败,此时可将None改为False或其它的值,只要不是None就行。

    editable

    如果设为False,那么当前字段将不会在admin后台或者其它的ModelForm表单中显示,同时还会被模型验证功能跳过。参数默认值为True。

    error_messages

    用于自定义错误信息。参数接收字典类型的值。字典的键可以是nullblankinvalidinvalid_choiceuniqueunique_for_date其中的一个。

    help_text

    额外显示在表单部件上的帮助文本。使用时请注意转义为纯文本,防止脚本攻击。

    primary_key

    如果你没有给模型的任何字段设置这个参数为True,Django将自动创建一个AutoField自增字段,名为‘id’,并设置为主键。也就是id = models.AutoField(primary_key=True)

    如果你为某个字段设置了primary_key=True,则当前字段变为主键,并关闭Django自动生成id主键的功能。

    primary_key=True隐含null=Falseunique=True的意思。一个模型中只能有一个主键字段!

    另外,主键字段不可修改,如果你给某个对象的主键赋个新值实际上是创建一个新对象,并不会修改原来的对象。

    from django.db import models
    class Fruit(models.Model):
        name = models.CharField(max_length=100, primary_key=True)
    ###############    
    >>> fruit = Fruit.objects.create(name='Apple')
    >>> fruit.name = 'Pear'
    >>> fruit.save()
    >>> Fruit.objects.values_list('name', flat=True)
    ['Apple', 'Pear']
    

    unique

    设为True时,在整个数据表内该字段的数据不可重复。

    注意:对于ManyToManyField和OneToOneField关系类型,该参数无效。

    注意: 当unique=True时,db_index参数无须设置,因为unqiue隐含了索引。

    注意:自1.11版本后,unique参数可以用于FileField字段。

    unique_for_date

    日期唯一。可能不太好理解。举个栗子,如果你有一个名叫title的字段,并设置了参数unique_for_date="pub_date",那么Django将不允许有两个模型对象具备同样的title和pub_date。有点类似联合约束。

    unique_for_month

    同上,只是月份唯一。

    unique_for_year

    同上,只是年份唯一。

    verbose_name

    为字段设置一个人类可读,更加直观的别名。

    对于每一个字段类型,除了ForeignKeyManyToManyFieldOneToOneField这三个特殊的关系类型,其第一可选位置参数都是verbose_name。如果没指定这个参数,Django会利用字段的属性名自动创建它,并将下划线转换为空格。

    下面这个例子的verbose name是"person’s first name":

    first_name = models.CharField("person's first name", max_length=30)
    

    下面这个例子的verbose name是"first name":

    first_name = models.CharField(max_length=30)
    

    对于外键、多对多和一对一字字段,由于第一个参数需要用来指定关联的模型,因此必须用关键字参数verbose_name来明确指定。如下:

    poll = models.ForeignKey(
        Poll,
        on_delete=models.CASCADE,
        verbose_name="the related poll",
        )
    sites = models.ManyToManyField(Site, verbose_name="list of sites")
        place = models.OneToOneField(
        Place,
        on_delete=models.CASCADE,
        verbose_name="related place",
    )
    

    另外,你无须大写verbose_name的首字母,Django自动为你完成这一工作。

    validators

    运行在该字段上的验证器的列表。

  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/feixuelove1009/p/8416108.html
Copyright © 2011-2022 走看看