gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:17 24 4
gpt4 key购买 nike

框架的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com