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

时间:2019-07-09 18:38:41

标签: 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机制,而不是模型/字段。

1 个答案:

答案 0 :(得分:0)

表单和模型遵循相同的基本思想,但是表单要简单一些,因此让我们在那里进行浏览。

The DeclarativeFieldsMetaclass metaclass用于Form
它在声明时收集field(通过MRO行走,但基本思想是看它们是否为isinstance(x, Field)),将其从具体的类声明中删除,然后将其移至{ {1}}(其中cls.base_fields是您要声明的类)。

实例化您自己的这个新cls时,this code over here个深层副本Form(在类级别,但是不重要)到self.base_fields中(所以您可以安全地在每个表单实例中修改self.fields,而不会在请求中影响其他实例。

基本上就是这样。

除此之外,如果您想要一个在单独的属性上收集了必填字段的东西,则类似

self.fields