我正在处理的应用程序需要合并相同类型的Django模型。这些模型保留的状态可以按时间顺序更改,因此它不像将一个对象复制到另一个对象那样简单,因为采用最新值或始终复制真实值并不总是正确的。
我已经编写了一个客户模型合并类来处理此操作,但是,我需要能够逐字段描述是否应将其包含在该合并中,以及是否要包含在合并中,如何处理合并。
我已经尝试创建字典来描述这种行为并将其传递到合并中。但是,这在更高级别的嵌套中变得笨拙,并且对代码库的更改非常脆弱。
我还尝试过为每个单独的模型添加合并方法,该方法解决了该问题,但是如果遗漏了位于不同模型上的外键关系或代码库发生更改,则很容易失败。
我已经开始在Django中编写每个字段的自定义版本,因为这些字段看起来像是逻辑存在的正确地方,但是必须维护每个字段的自定义版本也感到不便和脆弱。
Django中是否有一种方法可以将附加的关键字参数添加到基本Field类中,或者装饰每个字段而不必将其子类化?
谢谢
答案 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中找到有关创建自定义字段的更多信息。