zoukankan      html  css  js  c++  java
  • Django学习日记03_模型_Fields

    创建模型

    模型对应工程中的应用,一个工程可能包含很多的应用,通过命令

    python manage.py startapp myapp

    创建一个叫myapp的应用,django会帮助生成以下目录:

    polls/
        __init__.py
        admin.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py

    其中,models.py 中就是实现模型设计的地方。

    python通过模型的搭建避免直接操作数据库,而通过配置数据库环境,在不改变模型的情况下对数据库进行切换也没有问题,不仅方便数据库升级或者改变,也方便管理数据模型。

    根据djangodocument的指引,编辑models.py创建一个Person的模型:

    class Person(models.Model):
        first_name = models.CharFeild(max_length=30)
        last_name = models.CharFeild(max_length=30)

    以上就创建了一个Person模型,对应到数据库,可以看成是创建了一个表单,包含first name和last name两个字段以及django自动创建的主键:id。如果想要指定主键而不是自动创建的id作为主键的话,需要在CharFeild对象初始化时添加属性:primary_key = True 。

    Fields

    Fields是模型最重要的一部分,是数据的主体。和数据库相对应的,Field也有很多的类型,用得比较多的如上例的CharField创建字符型字段,BigIntegerField可以创建64位最大整形的字段,TextFeild可以创建大字符串字段,BinaryField可以创建字节型字段,BooleanFeild可以创建布尔型字段,还有一些表示功能的EmailField、DateField、TimeField、DateTimeField、IPAddressField等等。

    除了指定Field类型外,还需要通过一定的属性来加以约束。如设置blank属性为True则允许字段为空,否则不允许;通过设置default属性可以指定一个默认值,该默认值会在所有的模型实例中都会被引用,所以绝对不能是一个可变对象(字典、列表、集合等),否则所有的实例都引用同一个对象,可想而知改变都是同步的,如果需要用到可变对象的话,应该将其包装成可执行的对象,如下例中,JSON字段将一个字典作为默认值:

    def contact_feild_default():
        return {'email':'abc@example.com'}
    contact_info = models.JSONField("ContactInfo",default=contact_feild_default)

    通过指定choices属性,可以将该字段变为可选值,可选值必须是可迭代的:

    PROVINCE_CHOICES = (
        (‘ZJ’,'Zhejiang'),
        (‘FJ','Fujian'),
        (‘BJ','Beijing'),
        (‘SH','Shanghai'),
    )
    address = models.CharFeild(max_length = 3 ,choices = PROVINCE_CHOICES,default='ZJ')

    其中,元组中的第一个元素表示在数据库中实际使用的内容,第二个元素是便于使用者理解的名字。

    可选常量都要写在类定义中,一来可以便于管理命名空间,第二可以方便调用一些常量。在django1.7中,新添加了分组的可选模式

    MEDIA_CHOICES = (
       ('Audio', (
                ('vinyl', 'Vinyl'),
                ('cd', 'CD'),
            )
        ),
        ('Video', (
                ('vhs', 'VHS Tape'),
                ('dvd', 'DVD'),
            )
        ),
        ('unknown', 'Unknown'),
    )

    分组模式中可以包含未分组的元组,前两个分组中,Audio、Video表示组别,组别内的元组第一个元素是实际使用的值,第二个元素是便于使用者理解的名字。

    django支持的都是关系型数据库,可以在Field中指定关系模型。如ForeignKey指定外键:

    class Car(models.Model):
        manufacturer = models.ForeignKey('Manufacturer')
        # ...
    class Manufacturer(models.Model):
        # ...
        pass

    在ForeignKey中使用一个字符串来表示要使用的外键的模型名,django会解析该字符串,并找到响应的模型。如果该模型不在同一个app中,使用 ForeignKey(‘appname.ModelName’)同样可以完成解析。

    可以指定外键的属性来加以约束,如related_name,related_query_name,to_field,on_delete,等等,不太明白怎么用,看来以后要恶补一下数据库的知识了。

    通过外键可以实现比较复杂的多对多的数据模型

  • 相关阅读:
    php filter 安全过滤函数
    python常用快捷键
    【python】详解time模块功能asctime、localtime、mktime、sleep、strptime、strftime、time等函数以及时间的加减运算
    linux VIM基本命令
    vim常用命令总结 (转)
    sklearn中的交叉验证(Cross-Validation)
    scikit-learn 0.18中的cross_validation模块被移除
    python logging模块
    随机森林参数理解与调优
    kaggle 欺诈信用卡预测——Smote+LR
  • 原文地址:https://www.cnblogs.com/lyon2014/p/4579427.html
Copyright © 2011-2022 走看看