三、模型层(二)

一、模型层创建数据库常见字段
#### 常用字段类型
* django所有的数据模型都继承自models.Model
* CharField  max_length   (输入框)
* TextField 没有长度限制的字符串  (文本域)
* DateField 日期
* DateTimeField 日期+时间
* BooleanField 真假
* NullBooleanField Null,真假,
* Integer 整数
* PositiveIntegerField 正整数
* DecimalField  max_digits(几位数) decimal_places(小数点后保留几位)
* ImageField  图片 依赖于 Pillow(处理图片) upload_to='upload'  指定文件上传到目录
* FileField(ImageField继承FileField)
* AutoField
* ForeignKey 1:n
* ManyToManyField n:n
* EmailField 邮箱
* UUIDField 重复的概率非常低基本可以忽略,全世界都不一样的标示,uuid的产生和服务器的环境有关(CPU,网关,) 唯一性的标示,用户模块,订单号
* 不同的字段在后台对应不同的html的组件
ImageField 依赖于Pillow组件(python库)

#### 常用属性
* unique 标示这个字段唯一
* default  默认的意思 ,(如果不写的话就使用默认的值)
* null=True 允许字段为null,(允许数据库为null)数据库层面的
* blank=True 表单阶段的,admin后台的
* auto_now 针对时间的,自动调整当前,(当修改条目的时候,这个时间会自动更新),每次修改都会更新  (修改,保存的时候才会生效,)
* auto_now_add 针对时间的,只添加一次,(创建的时间)

 
### 重点理解属性 ###
* 表单层面的东西(js判断字段是否是"    "),不需要重写迁移数据库
* unique=True  可以任何字段
* default 数据库+表单层面(同时生效)
* auto_now_add 创建的时候会自动的添加时间(数据库),(后台表单层面找不到这个字段)
* auto_now 每次修改的时候自动更新,(数据库+表单层面)
* null=True 数据库层面,允许为Null,不是空字符串
* blank=True 表单层面的,后台选填(表单项元素可以为空,表单不会进行非空校验)
### uuid ###
   uuid.uuid4().get_hex()
二、自定义Manage
#### 重写create()
```
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db.models.manager import Manager
 
class CustomManager(Manager):
    # 重写方法Student.objects.create()
    # 实现Student.objects.create(sname='lisi',clazz='B208Python',course=('HTML5','UI','Java','Python'))
    def create(self, **kwargs):
        clsname=kwargs.get('clazz')
        clazz = self.__get_cls(clsname)
        kwargs['clazz']=clazz
        course=kwargs.pop('course')
        stu = Manager.create(self,**kwargs)
        stu.save()
        stu.course.add(*self.__get_course(*course))
        stu.save()
        return stu

    def __get_cls(self, clsname):
        try:
            cls = Clazz.objects.get(cname=clsname)
        except Clazz.DoesNotExist:
            cls = Clazz.objects.create(cname=clsname)
            cls.save()
        return cls

    def __get_course(self,*course):
        row_course=[]
        for cour in course:
            try:
                r_cour = Course.objects.get(course_name=cour)
            except Course.DoesNotExist:
                r_cour = Course.objects.create(course_name=cour)
                r_cour.save()
            row_course.append(r_cour)
        return row_course
 
class Clazz(models.Model):
    cname=models.CharField(max_length=30,unique=True)
    class Meta:
        db_table='t_clazz'
    def __unicode__(self):
        return u'Clazz:%s'%self.cname
class Course(models.Model):
    course_name=models.CharField(max_length=30,unique=True)
    class Meta:
        db_table='t_course'
    def __unicode__(self):
        return u'Course:%s'%self.course_name

# Create your models here.
class Student(models.Model):
    sname=models.CharField(max_length=30,unique=True)
    clazz=models.ForeignKey(Clazz)
    course=models.ManyToManyField(Course)

    objects=CustomManager()
 
    class Meta:
        db_table='t_student'
    def __unicode__(self):
        return u'Student:%s'%self.sname
 
 
 
```
原文地址:https://www.cnblogs.com/dangjingwei/p/12685771.html