zoukankan      html  css  js  c++  java
  • 三、模型层(二)

    一、模型层创建数据库常见字段
    #### 常用字段类型
    * 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
     
     
     
    ```
  • 相关阅读:
    Chrome 扩展及应用开发
    nslinebreakbywordwrapping or nslinebreakcharwrapping
    动态计算uilabel的高度,
    长度还是靠谱,
    dictionary allkeys
    适配
    Linux 下phpstudy的安装使用补充说明
    mysql使用Navicat 导出和导入数据库
    Mysql命令mysql:连接Mysql数据库
    远程连接阿里云服务器ping不通ip解决方案
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/12685771.html
Copyright © 2011-2022 走看看