zoukankan      html  css  js  c++  java
  • django笔记1

      最近在博客园看来越来越多的关于python的文章,我看到时感觉特别的好,因为我也是一个特别喜欢python这门语言,喜欢python的简洁、干净,简洁而不失强大。

      最近在学习django的Model模型,记录的笔记如下:

    from django.db import models

     

    class Person(models.Model):

        name = models.CharField(maxlength=10)

     

    class Man(Person):

        job = models.CharField(maxlength=20)

     

    class Woman(Person):

        makeup = models.CharField(maxlength=20)

     

    则使用manage.py执行sqlall命令时,会看到这样的结果:

     

    CREATE TABLE "uom_person" (

    "id" integer NOT NULL PRIMARY KEY,

    "name" varchar(10) NOT NULL

    );

     

    CREATE TABLE "uom_man" (

    "person_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "uom_person" ("id"),

    "job" varchar(20) NOT NULL

    );

     

    CREATE TABLE "uom_woman" (

    "person_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "uom_person" ("id"),

    "makeup" varchar(20) NOT NULL

    );

     

    可见,Django ORM中默认使用JOINED方式来实现继承关系的映射。

     

    TABLE_PER_CLASS映射

    如果要实现每个具体类一张表,只需要将父类指定为抽象类(abstract),这样就不会创建父类对应的表,而将父类的字段复制到子类中去映射。如下:

     

    from django.db import models

     

    class Person(models.Model):

        name = models.CharField(max_length=10)

     

        class Meta:

            abstract = True

     

    class Man(Person):

        job = models.CharField(max_length=20)

     

    class Woman(Person):

        makeup = models.CharField(max_length=20)

     

    sqlall 的结果:

     

    CREATE TABLE "uom_man" (

    "id" integer NOT NULL PRIMARY KEY,

    "name" varchar(10) NOT NULL,

    "job" varchar(20) NOT NULL

    );

     

    CREATE TABLE "uom_woman" (

    "id" integer NOT NULL PRIMARY KEY,

    "name" varchar(10) NOT NULL,

    "makeup" varchar(20) NOT NULL

    );

    将父类声明为abstract时,该类将没有objects属性,也就是说没有Manager方法,所有无法进行数据操作,只有子类才能进行。

    SINGLE_TABLE映射

    在TABLE_PER_CLASS的基础上,如果进一步指定子类的映射表名与父类的相同,则子类和父类将映射到同一张表,对所有的子类都这样指定,就可以实现SINGLE—_TABLE映射:

     

    from django.db import models

     

    class Person(models.Model):

        name = models.CharField(max_length=10)

        class Meta:

            abstract = True

     

    class Man(Person):

        job = models.CharField(max_length=20)

        class Meta:

            db_table = 'oum_person'

     

    class Woman(User):

        makeup = models.CharField(max_length=20)

     

    sqlall 的结果:

     

    CREATE TABLE "oum_person" (

    "id" integer NOT NULL PRIMARY KEY,

    "name" varchar(10) NOT NULL,

    "job" varchar(20) NOT NULL

    );

     

    CREATE TABLE "uom_woman" (

    "user_ptr_id" integer NOT NULL PRIMARY KEY,

    "makeup" varchar(20) NOT NULL

    );

    请关照我的个人项目(totemhub)

  • 相关阅读:
    赶紧收藏吧!MyBatis-Plus万字长文图解笔记,错过了这个村可就没这个店了
    这篇建议java开发都看看,对Java方法及加深理解的很深,值得一看!
    秒极啊!手把手带你进行shiro授权拦截器的重写,学到了学到了
    java面试复习重点:类的管理及常用工具,教你抓住面试的重点!
    手撸一个外卖点餐系统后台,可以写上简历的实战项目!
    JVM类加载机制详解,建议看这一篇就够了,深入浅出总结的十分详细!
    这份SpringMVC执行原理笔记,建议做java开发的好好看看,总结的很详细!
    iOS-----GitHub上比较齐全的iOS 工具和App
    iOS-----AVFoundation框架的功能详解
    iOS-----UIScrollView
  • 原文地址:https://www.cnblogs.com/zhangligopher/p/4687746.html
Copyright © 2011-2022 走看看