概念:
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
- abstract=True 抽象类(父类)
- db_name 表名指定(物理名称)
- verbose_name(逻辑名称)
- default_related_name 外键反向查询的字段名(默认_set)
- get_latest_by 指定 first(), last() 的排序条件
- default_permissions = () model的默认权限指定
- 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
通常指定DateField
,DateTimeField
或IntegerField
字段。用于数据排序,默认为主键。
应用: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
在模型上指定。
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 权限。
7, managed
默认为True
,意味着 Django 会在migrate
中创建相应的数据库表,或者作为迁移的一部分。
class Meta:
default_permissions = ()
db_table = 'master_product_view' # 例如访问view,或者 link表
managed = False # VIEW,link tbl 通过DDL直接生成,migrate时不需要做表
官方文档 class meta
官方文档 proxy model