框架的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机制,而不是模型/字段。
答案 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