美文网首页
Django官方文档中文版-Model层

Django官方文档中文版-Model层

作者: 青铜搬砖工 | 来源:发表于2018-03-29 13:21 被阅读0次

    (本人大学英语四级及格水平,渣渣翻译,每天翻译半小时,有不对的地方还请留言指正)
    (官方文档链接:https://docs.djangoproject.com/en/2.0/topics/db/models/

    Models

    Model是你数据信息的唯一,确定的来源。它包含了基础字段(fields)和存储数据时的行为。总的来说,每一个Model都匹配一个数据表。

    基础:

    • 每一个Model都是一个继承于django.db.models.Model的class
    • Model的每一个属性都代表着数据表中的一个字段
    • Django提供了一个自动生成的数据库访问的API,参见Making queries.

    小栗子

    这个model例子定义了一个Person类,包含first_namelast_name字段

    from django.db import models
    
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)
    

    first_namelast_name都是model的字段,并且也作为一个class的属性,每个属性同时也对应数据表中的一个列名。

    上面的Person模型将会创建如下的数据表:

    CREATE TABLE myapp_person (
        "id" serial NOT NULL PRIMARY KEY,
        "first_name" varchar(30) NOT NULL,
        "last_name" varchar(30) NOT NULL
    );
    

    一些提示:

    • 数据表的名称:myapp_person,是通过modelmetadata自动生成的,但是可以被重写。重写方法参见: Table names
    • id字段被自动添加,但是这些行为可以被重写。
      参见Automatic primary key fields
    • 本例中的CREATE TABLESQL语句使用的是PostgreSQL的语法进行格式化,但是值得注意的是Django使用的SQL语句是针对您设置文件中指定的后端数据库。
      配置文件:settings file

    Using models

    一旦你已经创建了你的models,你需要告诉Django你准备去使用这些models。把包含你model.py的模块(module)名称添加到配置文件(setting file)的INSTALLED_APPS中去,就可以使用这些model了。

    例如,如果包含model.pyapp名称为myapp.modelsINSTALLED_APPS应该添加如下信息(app可以使用manage.pystartapp命令创建):

    INSTALLED_APPS = [
        #...
        'myapp',
        #...
    ]
    

    当你往INSTALLED_APPS中添加新app时,一定要运行 manage.py
    migrate命令,在运行migrate命令前,可以选择运行manage.pymakemigrations命令。

    Fields

    一个model中最重要的部分,也是model中唯一需要的部分,就是它定义的一连串的数据库的字段。field由类属性指定。值得注意的是,字段名称选取时不要选择与model API冲突的名称,例如clean,save,delete等。
    例子:

    from django.db import models
    
    class Musician(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        instrument = models.CharField(max_length=100)
    
    class Album(models.Model):
        artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    #on_delete=models.CASCADE级联删除,当删除主表数据时,从表中的数据也一起删除
        name = models.CharField(max_length=100)
        release_date = models.DateField()
        num_stars = models.IntegerField()
    

    Field类型(Field types)

    model中的每一个field,都应该选择一个合适的Field类去实例化。Django使用field类的类型去完成一些东西:

    • 数据表列类型,它告诉数据库是什么类型的数据被存储。(例如:INTEGER,VARCHAR,TEXT)。
    • 一个缺省的HTML微件( widget)当渲染一个form的字段时。(例如:<input type="text">, <select>
    • Djangoadmin 与自动生成的表单中,field类型是最小的验证需求。
      Django提供了数十种内置的字段类型;您可以在模型字段引用( model field reference
      )中找到完整的列表。如果Django的内置函数不能满足你的需求的话,你也可以自己编写自己的field。参见 Writing custom model fields.
      Django提供的内置Field 类型
    __all__ = [str(x) for x in (
        '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',
    )]
    

    Field 选项(options)

    每一个field都有其特有的参数集,例如CharField(和它的子类)需要一个max_length的参数来规定这个field在数据库表对应列的varchar的长度。

    同样所有的field也有一些共同的参数集。这些共有的参数集都是可选择的。下面介绍几个经常使用到的参数:

    null

    如果为True,Django将存储空到数据表。缺省为False

    blank

    如果为True,这个字段允许为空白(blank),缺省为False

    注意,blanknull是不同的,null是单纯的与数据库相关的而blank是与有效性相关的。如果一个fiels定义blank = True,从有效性上来说将允许存入空白。(空白不等于空,空字符串也是空白,但不为空。所以CharFieldTextField不建议使用null,如果使用null,则它们存在两种“null”的形式,一个为null,一个为空字符串)

    choices

    当需要一个2元祖作为选择时可以使用choices。如果model中给出了choices,则缺省的form widget会用一个选择框代替这个二元组。
    choices形式列表如下:

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

    每一个元祖的第一个元素会存入数据库,而第二个元素会显示到form widget创建的选择框中。

    一个model的例子,可以通过get_FOO_display()方法获得一个fieldchoice的显示值。(display value)。例子如下:

    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'
    

    (持续更新中)

    相关文章

      网友评论

          本文标题:Django官方文档中文版-Model层

          本文链接:https://www.haomeiwen.com/subject/gljmcftx.html