Django model,baseModel基类, migrate移行

2022-08-07 05:19:00 浏览数 (2)

概念:

model ⇔ class ⇔ DB table

model就是一个class,通过migrate 移行命令,可自动创建数据库表。

应用:

类中的共通项目,可以定义到baseModel,其他类继承baseModel即可。

比如,create_user. create_datetime, update_user, update_datetime, delete_flag etc

注意点以及基类的创建:

因为migrate命令执行时,会把所有model作为对象,生成数据库表。但是baseModel,不需要生成对应的表。

也就是说,baseModel,作为抽象类(做个好爸爸),给children 继承即可。

代码语言:python代码运行次数:0复制
from django.db import models

class BaseModel(models.Model):
    deleted    = models.BooleanField(default=False, verbose_name='削除フラグ')
    deleted_by = models.CharField(default="", max_length=30, verbose_name='削除者')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='登録日時')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新日時')
    created_by = models.CharField(default="", max_length=30, verbose_name='登録者')
    updated_by = models.CharField(default="", max_length=30, verbose_name='更新者')

    class Meta:
        abstract=True    # 指定抽象类

--------------------------------------------
from django.db import models
from ..models import BaseModel

class ProductDetail(BaseModel):
    product_id  =   models.IntegerField(verbose_name='商品ID', default=0)

    class Meta:
        verbose_name = '商品詳細' 
        db_table = 'master_product_detail'  # 指定名 Table名

Model定义 meta

  1. abstract=True 抽象类(父类)
  2. db_name 表名指定(物理名称)
  3. verbose_name(逻辑名称)
  4. default_related_name 外键反向查询的字段名(默认_set)
  5. get_latest_by 指定 first(), last() 的排序条件
  6. default_permissions = () model的默认权限指定
  7. managed 迁移对象指定

1.abstract=True 抽象类指定

2.db_name 表名指定

若不指定别名,Django默认用APP名 '_' 类名。类名会全部转换成小写字母,区分单词就很困难了。

例如:master_productdetail,这样的表名来一打儿,必晕无疑了吧。

代码语言:python代码运行次数:0复制
master.ProductDetail.py

class ProductDetail(BaseModel):
    product_id  =   models.IntegerField(verbose_name='商品ID', default=0)

→生成表名【master_productdetail】
---------------------------------------------
class ProductDetail(BaseModel):
    product_id  =   models.IntegerField(verbose_name='商品ID', default=0)

    class Meta:
        verbose_name = '商品詳細'
        db_table = 'master_product_detail'  # 指定名 Table名
        
→生成表名【master_product_detail】

3.verbose_name 逻辑名称,单数

如果没有给定,Django 将使用一个 munged 版本的类名:CamelCase变成camelcase

复数名称用:verbose_name_plural

管理画面标示的名称是这样的,默认加s

4. default_related_name

在外键中设置外键反向查询的字段名。默认 类名小写 '_set'

如下,OrderDetail 参照ProductDetail ,检索可以这样写:

代码语言:python代码运行次数:0复制
class ProductDetail(BaseModel):
    product_id  =   models.IntegerField(verbose_name='商品ID', default=0)

    class Meta:
        verbose_name = '商品詳細'
        db_table = 'master_product_detail' 
        # default_related_name = 'Product_set'   # 用默认就好,不用定义
         
class OrderDetail(BaseModel):
    order_id  =   models.IntegerField(verbose_name='受注ID', default=0)
    product   =   models.ForeignKey(ProductDetail, on_delete=models.SET_NULL, verbose_name='商品', null=True)

    class Meta:
        verbose_name = '受注詳細'
        db_table = 'master_order_detail'
代码语言:python代码运行次数:0复制
order_view.py

product= ProductDetail.objects.filter(product_id=1).first()  # 指定商品
orders = product.orderdetail_set.all() # 指定商品的全部订单,类名小写_set。

补充:

on_delete在外键中必须设置,表示级联关系。

 级联关系:例,主表数据删除后,参照表的外键值,如何处理。

  限制 insert参照表的数据之前,主表必须先登录数据,以避免脏数据产生等。

CASCADE:默认值,级联。 例:product被删,order也删。

DO_NOTHING:外键不会被级联。例:product被删,order的外键product不做任何处理

SET_DEFAULT:配合default属性使用。假设A表依赖B表,B记录删除,A表的外键字段重置为default属性设置的值。

SET_NULL:配合NULL=True使用。假设A表依赖B表,B记录删除,A表的外键字段重置为NULL,

例:product被删,order的外键product,重置为NULL

注:多对多字段不能设置on_delete级联关系。有空再研究。

扩展:

对 related_name 和 related_query_name 要格外小心

5 get_latest_by

通常指定DateFieldDateTimeFieldIntegerField字段。用于数据排序,默认为主键。

应用:ProductDetail.Objects.filter(conditions).first(), 这个取第一条的处理,就用到指定排序下的第一条。

代码语言:python代码运行次数:0复制
class ProductDetail(BaseModel):
    product_id  =   models.IntegerField(verbose_name='商品ID', default=0)

    class Meta:
        # Latest by ascending order_date.
        get_latest_by = "order_date"

        # Latest by priority descending, order_date ascending.
        get_latest_by = ['-priority', 'order_date']

6.default_permissions()

默认值为('add','change','delete','view')。你可以自定义这个列表,例如,如果你的应用不需要任何默认的权限,可以将其设置为空列表。它必须在模型创建之前通过migrate在模型上指定。

代码语言:python代码运行次数:0复制
class PermissionSetting(BaseModel):
    permission = models.OneToOneField(Permission, primary_key=True, on_delete=models.CASCADE, verbose_name='権限')

    class Meta:
        db_table = 'master_permission_setting'
        default_permissions()
        permissions = (
            ('master_access',       '統合マスタアクセス'),
        )

比如user等自带的表,执行migrate后,auth_permission表下会生成这样的权限。

id:1-16为默认权限。

id:17,声明了default_permissions(),所以没有生成 add, change, delete, view 权限。

auth_permissionauth_permission
django_content_type, 24 为自定义modeldjango_content_type, 24 为自定义model

7, managed

默认为True,意味着 Django 会在migrate中创建相应的数据库表,或者作为迁移的一部分。

代码语言:python代码运行次数:0复制
    class Meta:
        default_permissions = ()
        db_table = 'master_product_view'  # 例如访问view,或者 link表
        managed  = False                  # VIEW,link tbl 通过DDL直接生成,migrate时不需要做表

官方文档 class meta

官方文档 proxy model

0 人点赞