三、模型层(二)
一、模型层创建数据库常见字段
#### 常用字段类型
* 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的组件
* 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 表单层面的,后台选填(表单项元素可以为空,表单不会进行非空校验)
* 表单层面的东西(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 __future__ import unicode_literals
from django.db import models
from django.db.models.manager import Manager
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
# 重写方法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.save()
stu.course.add(*self.__get_course(*course))
stu.save()
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)
cname=models.CharField(max_length=30,unique=True)
class Meta:
db_table='t_clazz'
db_table='t_clazz'
def __unicode__(self):
return u'Clazz:%s'%self.cname
return u'Clazz:%s'%self.cname
class Course(models.Model):
course_name=models.CharField(max_length=30,unique=True)
course_name=models.CharField(max_length=30,unique=True)
class Meta:
db_table='t_course'
db_table='t_course'
def __unicode__(self):
return u'Course:%s'%self.course_name
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'
db_table='t_student'
def __unicode__(self):
return u'Student:%s'%self.sname
return u'Student:%s'%self.sname
```