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 继承即可。
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名
若不指定别名,Django默认用APP名 + '_' + 类名。类名会全部转换成小写字母,区分单词就很困难了。
例如:master_productdetail,这样的表名来一打儿,必晕无疑了吧。
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】
如果没有给定,Django 将使用一个 munged 版本的类名:CamelCase
变成camelcase
。
复数名称用:verbose_name_plural
管理画面标示的名称是这样的,默认加s
在外键中设置外键反向查询的字段名。默认 类名小写 + '_set'。
如下,OrderDetail 参照ProductDetail ,检索可以这样写:
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'
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 要格外小心
通常指定DateField
,DateTimeField
或IntegerField
字段。用于数据排序,默认为主键。
应用:ProductDetail.Objects.filter(conditions).first(), 这个取第一条的处理,就用到指定排序下的第一条。
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']
默认值为('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时不需要做表
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。