python - Django 模型和字段的机制背后是什么?

标签 python django design-patterns

框架的 Django 模型/字段部分背后的 Django/Python 机制是什么?

确切地说,我正在寻找有关 Django 如何解析(?)类定义然后知道哪些字段是必需的的提示?

from django.db import models


class Car(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    year_of_production = models.DateField(null=True)
    # the rest of fields...

我认为 Django Forms 框架或 DRF 序列化器背后有相同的机制。我检查了这些项目的存储库,但仍然找不到任何合理的起点。

我的问题存在架构问题。我想我需要实现类似于此机制的东西:

class Field:
    def __init__(self, label: str, required: bool = True, **kwargs):
        self.label, self.required = label, required


class CharField(Field):
    def __init__(self, max_length: int, **kwargs):
        self.max_length = max_length
        super().__init__(**kwargs)

class DateField(Field):
    ...

class BooleanField(Field):
    ...

class Model:
    # the mechanisms I do not understand

class MyModelInstance(Model):
    name = CharField(...)
    # etc.    

我需要的是非常简单的解决方案,知道该字段是必需的。但正如我之前所说,我并不那么先进,我真的很感激任何提示。

编辑:我想我正在寻找类似 Django Forms 机制的东西,而不是模型/字段。

最佳答案

表单和模型遵循相同的基本思想,但表单稍微简单一些,所以让我们浏览一下。

The DeclarativeFieldsMetaclass metaclass用于Form .
它在声明时收集 field(进行一些 MRO 遍历,但基本思想是查看它们是否是 isinstance(x, Field)),删除将它们从具体的类声明中取出,并将它们移至 cls.base_fields 中(其中 cls 是您要声明的类)。

当您实例化这个新的 Form 时,this code over hereself.base_fields (这是在类级别上,但这不是重点)深度复制到 self.fields (这样您就可以安全地修改 self.fields code> 在每个表单实例中,而不影响请求中的其他表单实例。

基本上就是这样,真的。

除此之外,如果您想要一个在单独的属性上收集必填字段的东西,那就是这样的

cls.required_fields = {f for f in cls.base_fields if f.required}

关于python - Django 模型和字段的机制背后是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56958804/

相关文章:

python - pylint、协程、装饰器和类型推断

Elastic Beanstalk 上的 Django "requirements.txt"无效

django - 在 Django 管理中捕获保存异常?

Django-CMS 3.0.3 发布页面会重复插件 django-cms-saq 中的数据

language-agnostic - 如果工厂返回的对象是静态的,它仍然被认为是工厂吗?

python - 神经网络中 DataFrame 的批量输入

python - 如何以 pandastic 方式更改列顺序(排序)?

Python "IOError: [Errno 21] Is a directory: '/home/thomasshera/Pictures/Star Wars'"

PHP 设计模式建议

java - 从 HashMap 存储和调用方法