首页 > 其他分享 >Django Meta中proxy、abstract、managed使用方法

Django Meta中proxy、abstract、managed使用方法

时间:2023-02-03 17:33:31浏览次数:60  
标签:managed Person models abstract Django class Meta 模型

目录

Django Meta中proxy、abstract、managed使用方法

proxy

使用 多表继承 时,每个子类模型都会创建一张新表。这一般是期望的行为,因为子类需要一个地方存储基类中不存在的额外数据字段。不过,有时候你只想修改模型的 Python 级行为——可能是修改默认管理器,或添加一个方法。

这是代理模型继承的目的:为原模型创建一个 代理。你可以创建,删除和更新代理模型的实例,所以的数据都会存储的像你使用原模型(未代理的)一样。不同点是你可以修改代理默认的模型排序和默认管理器,而不需要修改原模型。

代理模型就像普通模型一样申明。你需要告诉 Django 这是一个代理模型,通过将 Meta 类的proxy属性设置为 True

例如,假设你想为 Person 模型添加一个方法。你可以这么做:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

MyPerson 类与父类 Person 操作同一张数据表。特别提醒, Person 的实例能通过 MyPerson 访问,反之亦然。

>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.get(first_name="foobar")
<MyPerson: foobar>

你也可以用代理模型定义模型的另一种不同的默认排序方法。你也许不期望总对 “Persion” 进行排序,但是在使用代理时,总是依据 “last_name” 属性进行排序:

class OrderedPerson(Person):
    class Meta:
        ordering = ["last_name"]
        proxy = True

现在,普通的 Person 查询结果不会被排序,但 OrderdPerson 查询接轨会按 last_name 排序。

代理模型继承“Meta”属性和普通模型一样。

QuerySet 仍会返回请求的模型

当你用 Person 对象查询时,Django 永远不会返回 MyPerson 对象。Person 对象的查询结果集总是返回对应类型。代理对象存在的全部意义是帮你复用原 Person 提供的代码和自定义的功能代码(并未依赖其它代码)。不存在什么方法能在你创建完代理后,帮你替换所有 Person (或其它)模型。

abstract

"abstract" 参数在 Django 的 Meta 中用于标识一个模型是否为抽象模型。多用于存放公共的字段然后被继承。

当一个模型被定义为抽象模型时,它不会创建一张数据库表,并且仅仅作为一个基类被其他模型继承。抽象模型可以定义共同的字段和方法,这样可以在子类中重用。

格式如下:

class AbstractBase(models.Model):
    common_field = models.CharField(max_length=100)

    class Meta:
        abstract = True

class SubclassA(AbstractBase):
    another_field = models.CharField(max_length=100)

class SubclassB(AbstractBase):
    another_field = models.CharField(max_length=100)

在这个例子中,AbstractBase 是一个抽象模型,它具有一个共同的字段 common_fieldSubclassASubclassB 都是 AbstractBase 的子类,它们继承了 common_field 字段,并且可以定义自己的字段,如 another_field

managed

在models里再写模型是为了能用django orm操作改表

class BookPublish(models.Model):  # 这是个view
    detail = models.CharField(max_length=100)  # 在这里加字段没有任何作用,因为是视图

    class Meta:
        managed = False
        db_table = 'book_publish'

"managed" 参数在 Django 的 Meta 中用于控制是否让 Django 管理模型的数据库表的生成和迁移。

默认情况下,如果不指定 "managed" 参数,Django 会自动管理模型的数据库表。也就是说,Django 会在每次数据库迁移时,根据模型的字段和参数,更新数据库表的结构。

如果设置 "managed" 参数为 False,则不会由 Django 自动管理该模型的数据库表,并且不会在数据库迁移时更新表结构。这通常用于与外部数据库或应用程序进行集成,并且想要避免 Django 对数据库表进行任何更改。

格式如下:

class ExternalTable(models.Model):
    external_field = models.CharField(max_length=100)

    class Meta:
        managed = False

在这个例子中,ExternalTable 是一个不由 Django 管理的模型,它具有一个名为 external_field 的字段。由于 "managed" 参数设置为 False,因此 Django 不会在数据库迁移时更新该模型的数据库表。

标签:managed,Person,models,abstract,Django,class,Meta,模型
From: https://www.cnblogs.com/zonghan/p/17090001.html

相关文章

  • django rest framework 过滤时间操作
    https://www.nhooo.com/note/qa3v7f.html 通常我们会用到过滤两个时间段内的一些数据,当我们用djangorestframework的时候,他可以根据字段filter_fields进行过滤,但是......
  • django
    Djangodjango基本操作#命令行操作 #1.创建django项目 django-adminstartprojectmysite mysite文件夹 manage.py mysite文件夹 __init__.py settin......
  • 【Django drf】序列化器总结
    目录序列化器字段外键字段自定义序列化在模型类中写方法在序列化类中写方法反序列化外键字段反序列化保存序列化器字段序列化中的字段可以根据用途分为三种:既用于序列......
  • django框架之drf:04、序列化器常用字段及参数,序列化器高级用法之source、定制字段数据
    Django框架之drf目录Django框架之drf一、序列化器常用字段及参数1、常用字段2、常用字段参数3、字段参数针对性分类二、序列化器高级用法之source1、定制字段名三、定制......
  • django之drf(部分讲解)
    序列化类常用字段和字段参数drf在Django字段类型的基础上派生了自己的字段类型以及字段参数序列化器的字段类型用于处理原始值和内部数据类型直接的转换还可以用于验证......
  • Django学习教程
    一、django安装ubuntu一般都是自带python,可以先python3-V查看版本,没出现就代表未安装python安装python3sudoapt-getinstallpython3pip是Python包管理工具,提供了......
  • django REST framework-序列化器
    djangoRESTframework简介构建RESTful风格API的一个基于django的web框架。drf框架,restframework框架。特性:强大的序列化器,可以高效的进行序列化和反序列化操作。极......
  • django-admin
    day12django-admin只需通过简单的配置,就可以自动生成一套后端管理程序。安装创建django项目之后,默认情况下,django-admin就是可用。注册APP模板的设置设置中......
  • 创建第一个Django项目
    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier【提示】——项目开发环境,Windows10、Python3.6.6、Django1.11、Pycharm2017.31、Django管理工......
  • django框架之drf:3、API执行流程、Response源码剖析、序列化器的简介和使用、反序列化
    Django框架之drf目录Django框架之drf一、APIView执行流程1、API执行流程总结(重点)2、补充二、Response源码剖析1、Response类总结(重点)三、序列化器的介绍和使用1、序列化......