Django ORM:为“字段”而不是“模型”实现预保存

时间:2019-03-13 20:39:16

标签: python django python-3.x validation django-models

假设我有这个模型:

class MyModel(models.Model):
    char_field = models.CharField(max_length=64)
    json_field = LimitedJSONField(default={})

其中LimitedJSONField是用于在数据库上存储JSONStrings的自定义字段。

我想对json_field进行预保存检查(例如,如果超出长度,则将其截短)。我已经阅读了有关为save覆盖MyModel方法的知识,我也知道我可以实现一个pre-save信号,但是我想在字段级进行处理。因为假设我在500个模型上使用了LimitedJSONField。对于这500个模型中的每个模型,我都必须重写save方法吗?我在validate上实现了LimitedJSONField方法,但是在保存时不会被触发(仅在表单验证即full_clean例程中触发)。

我如何实现LimitedJSONField的验证器,以便无论Model使用哪种验证器,此字段都将针对LimitedJSONField内编写的单个业务逻辑进行验证?

简单地说,我想在field类中实现逻辑,并且我不想在Model类中编写逻辑,因此该解决方案可扩展为新Model类使用该字段而无需实施锅炉逻辑代码。

非常感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:1)

您可以使用单个保存方法制作一个父类并将其用作所有其他模型继承的mixin吗?

类似的东西:

class SpecialJsonModel(models.model):
    json_field = LimitedJSONField(default={})

    def save(self, *args, **kwargs):
        // Specific save logic goes here

class OtherModelA(SpecialJsonModel)
    char_field = models.CharField(max_length=64)

class OtherModelB(SpecialJsonModel)
    char_field = models.CharField(max_length=64)

然后,您只需要编写一个覆盖的保存方法即可。