如何在所有Django字段中添加其他关键字参数?

时间:2019-05-31 15:06:30

标签: python django architecture

我正在处理的应用程序需要合并相同类型的Django模型。这些模型保留的状态可以按时间顺序更改,因此它不像将一个对象复制到另一个对象那样简单,因为采用最新值或始终复制真实值并不总是正确的。

我已经编写了一个客户模型合并类来处理此操作,但是,我需要能够逐字段描述是否应将其包含在该合并中,以及是否要包含在合并中,如何处理合并。

我已经尝试创建字典来描述这种行为并将其传递到合并中。但是,这在更高级别的嵌套中变得笨拙,并且对代码库的更改非常脆弱。

我还尝试过为每个单独的模型添加合并方法,该方法解决了该问题,但是如果遗漏了位于不同模型上的外键关系或代码库发生更改,则很容易失败。

我已经开始在Django中编写每个字段的自定义版本,因为这些字段看起来像是逻辑存在的正确地方,但是必须维护每个字段的自定义版本也感到不便和脆弱。

Django中是否有一种方法可以将附加的关键字参数添加到基本Field类中,或者装饰每个字段而不必将其子类化?

谢谢

1 个答案:

答案 0 :(得分:0)

以防万一这对其他人有帮助,我最终创建了一个mixin并将每个字段归为子类。下面是一个简化的示例。

from django.db import models

class MappableFieldMixin():
    def __init__(self, should_map=True, map_mode=None, *args, **kwargs):
        self.should_map = should_map
        if should_map and not map_mode:
            raise TypeError('Mappable field requires map_mode if should_map set to True')
        self.map_mode = map_mode
        super().__init__(*args, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        kwargs['should_map'] = self.should_map
        kwargs['map_mode'] = self.map_mode
        return name, path, args, kwargs

class MappableBooleanField(MappableFieldMixin, models.BooleanField):
    pass

用法:

class Membership(models.Model):
    is_active = MappableBooleanField(map_mode=MapMode.MAP_ALWAYS, default=True)

您可以在Django documentation中找到有关创建自定义字段的更多信息。