框架的 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 here将 self.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/