前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django model,baseModel基类, migrate移行

Django model,baseModel基类, migrate移行

原创
作者头像
刀枪不入de王二花
修改2022-08-07 05:19:00
9270
修改2022-08-07 05:19:00
举报
文章被收录于专栏:BETTERBETTER

概念:

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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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_permission
auth_permission
django_content_type, 24 为自定义model
django_content_type, 24 为自定义model

7, managed

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

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

官方文档 class meta

官方文档 proxy model

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念:
  • 应用:
  • 注意点以及基类的创建:
  • Model定义 meta
    • 1.abstract=True 抽象类指定
      • 2.db_name 表名指定
        • 3.verbose_name 逻辑名称,单数
          • 4. default_related_name
            • 5 get_latest_by
              • 6.default_permissions()
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档