Django model操作记录

model操作记录

python manage.py makemigrations appName:模型修改保存记录文件中
appName:应用名,可以不输入
python manage.py migrate:将模型应用到数据库上,对模型进行增、删、修改

一、分包管理模型

  • 使用python manage.py startapp xxx新建应用,删除models.py文件
  • 在应用目录下新增文件夹models,并在其下新增文件__init__.py
  • 将模型归类到不同的文件中,文件保存在models文件夹中
  • __init__.py引入新增的模型
# coding=utf-8

from .req import RequestApi,RequestItem

二、模型的继承

1.抽象类继承,自定义将models转化为dict的方法

新建父model:BasicData,包含方法to_dict()

class BasicData(models.Model):

    create_time = models.DateTimeField(db_column='CreateTime', auto_now_add=True)
    update_time = models.DateTimeField(db_column='UpdateTime', auto_now=True)
    """
    将model转化为dict,此方法与 model_to_dict() 相同
    """
    def to_dict(self, fields=None, exclude=None):
        data = {}
        for f in self._meta.concrete_fields + self._meta.many_to_many:
            value = f.value_from_object(self)

            if fields and f.name not in fields:
                continue

            if exclude and f.name in exclude:
                continue

            if isinstance(f, models.ManyToManyField):
                value = [i.id for i in value] if self.pk else None

            if isinstance(f, models.DateTimeField):
                value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None

            data[f.name] = value
        return data

    class Meta:
        abstract = True

重点:模型的Meta类里添加abstract=True元数据项
然后,子类继承BasicData

class Parameter(BasicData):
    #.....
    class Meta:
        db_table = 'Parameter'

这里有几点要特别说明:

  • 抽象基类中有的元数据,子模型没有的话,直接继承;
  • 抽象基类中有的元数据,子模型也有的话,直接覆盖;
  • 子模型可以额外添加元数据;
  • 抽象基类中的abstract=True这个元数据不会被继承。也就是说如果想让一个抽象基类的子模型,同样成为一个抽象基类,那你必须显式的在该子模型的Meta中同样声明一个abstract = True
  • 有一些元数据对抽象基类无效,比如db_table,首先是抽象基类本身不会创建数据表,其次它的所有子类也不会按照这个元数据来设置表名。

三、字段类型设置

1、CharField
models.CharField(db_column='Key',max_length=128)

db_column:数据库列表
max_length:最多长度
blank=True:可以为空白
null=True:允许为null
unique= True:是否唯一,不允许重复

2、设置创建时间和最后修改时间
    models.DateTimeField(db_column='CreateTime', auto_now_add=True)
    models.DateTimeField(db_column='UpdateTime', auto_now=True)

auto_now_add:在创建时自动赋值当前时间,之后的操作不会被修改
auto_now:每次修改会赋值当前时间

3、设置枚举类型
  • 1.使用tuples实现枚举
# 设置枚举类型,数据类型:tuples
# 第一列:1;2;3 表示数据库存储值
# 第二列:为前端显示的值
PARAM_TYPE = (
    (0,'default'),
    (1,'header'),
    (2,'url'),
    (3,'form'),
)

models.CharField(db_column='ParamType',choices=argument.PARAM_TYPE, default=0, max_length=2)

choices:设置的枚举
default:必须设置默认值
max_length:必填,此次容易忽略

  • 2.使用枚举类
    • 首先设置枚举类,枚举必须继承Enum
from enum import Enum

class OptionType(Enum):
    skip = 1
    skipIf = 2
    skipUnless = 3
    variables = 4
  • model类中使用
from django.db import models

class WeOptions(models.Model):
    name = models.CharField(db_column='Name', max_length=128, unique=True)
    option_type = models.CharField(
        db_column='OptionType',
        max_length=2,
        choices=[(tag.name,tag.value,) for tag in OptionType]
    )


    def save(self, *args, **kwargs):
        # 正常使用时,option_type=OptionType.variables.name
        # 允许直接传入枚举,option_type=OptionType.variables
        if isinstance(self.option_type,Enum):
            self.option_type = self.option_type.name
        # 一定要继承父类的save()方法,否则不能保存到DB
        super().save(*args, **kwargs)
  • 使用
    myoptions = WeOptions(
        name='参数1',
        option_type=OptionType.variables
    )
    myoptions.save()

参考:django models choices的三种实现方式

4、设置多对一关系(外键)

外键要定义在‘多’的一方!

class Parameter(BasicData):
    #......
    request = models.ForeignKey(to='Request',on_delete=models.CASCADE)

class Request(BasicData):
    #.......

参数说明:

  • to:需要管理的model类名,例:
    • 同APP内:'className'
    • 不同APP:'appName.className'
    • 递归: 'self'
  • on_delete:被外键关联的对象被删除时,SQL约束执行相应操作
    • CASCADE:模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!(该操作为当前Django版本的默认操作!)
    • PROTECT:阻止上面的删除操作,但是弹出ProtectedError异常
    • SET_NULL:将外键字段设为null,只有当字段设置了null=True时,方可使用该值。
    • SET_DEFAULT:将外键字段设为默认值。只有当字段设置了default参数时,方可使用。
    • DO_NOTHING:什么也不做。
    • SET():设置为一个传递给SET()的值或者一个回调函数的返回值。注意大小写。

三、数据操作

1、数据整合

自定义dict过滤的方法:

# 过滤dict中的数据
def dictFilter ( collection, fields = None, exclude = None ):
    # 将object转化为dict
    if isinstance ( collection, (str, bytes) ):
        collection = json.loads ( collection, encoding = 'utf-8' )

    # 不是dict的直接返回collection
    if not isinstance ( collection, dict ):
        return collection

    data = {}
    for f in collection.keys ( ):

        if fields:
            # 过滤
            if isinstance ( fields, list ) and f not in fields:
                continue
            # 替换
            if isinstance( fields, dict ):
                if f in fields.keys():
                    data[fields[f]] = collection[f]
                    continue
                else:
                    continue
        # 排除
        if exclude and f in exclude:
            continue

        data[f] = collection[f]
    return data
2.增
  • 方法一
    使用对应的dict新增数据,推荐
    value = dictFilter(body,fields=['key','value','description',
                                    'enabled','param_type','id_delete'])
    if value['key'] and value['value']:
        _f = models.Parameter.objects.create(**value)
  • 方法二
_t = models.Parameter.objects.create(key=value['key'])
  • 方法三
f = models.RequestItem(key =value['key'])
f.save()
  • 方法四
t = models.Parameter()
t.key = value['key']
t.save()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容

  • 文章内容大部分参考官方文档,以作者理解叙述Django中模型是你的数据的唯一的,确定的信息源.它包含你所存储数据所...
    da_yu阅读 2,056评论 0 3
  • 模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。...
    Mlotjve阅读 33,873评论 3 16
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,068评论 0 8
  • Django 模型定义 Django 模型是使用 Python 代码对数据库中数据的描述,是数据的结构,包含数据的...
    Am3阅读 1,314评论 0 2
  • 点我查看本文集的说明及目录。 本项目相关内容包括: 实现过程: CH7 创建在线商店 CH8 管理支付和订单 CH...
    学以致用123阅读 3,561评论 0 6