【问题标题】:What's behind the mechanism of Django models and fields?Django模型和字段的机制背后是什么?
【发布时间】:2019-07-09 18:38:41
【问题描述】:

框架的 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 机制之类的东西,而不是模型/字段。

【问题讨论】:

    标签: python django design-patterns


    【解决方案1】:

    Forms 和 Models 遵循相同的基本思想,但 Forms 稍微简单一些,所以让我们来看看吧。

    The DeclarativeFieldsMetaclass metaclass 用于Form
    它在声明时收集fields(有一些 MRO 行走,但基本想法是看看它们是否是 isinstance(x, Field)),将它们从具体的类声明中删除并将它们移动到 cls.base_fields(其中cls 是您要声明的类)。

    当你实例化你的这个新的Form 时,this code over hereself.base_fields(这是在类级别,但那不是重点)复制到self.fields(这样你就可以安全地在每个内部修改self.fields在不影响其他请求的情况下形成实例。

    基本上就是这样,真的。

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2016-01-27
      • 1970-01-01
      • 2021-12-22
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多