首页 > 解决方案 > 如何在 django 中实现验证字段?

问题描述

在 Django 中,我想在BooleanField我的模型中添加一个类型为“已验证”的字段,该字段应指示当前模型实例是否已由员工用户成员审核。每当“已验证”字段以外的模型实例字段更改时,已验证字段值应重置为False. 每当仅更改了“已验证”字段时,它的值都应按原样(大多数情况下,True但也可能False如此)。

一种可能性是在考虑传递给的post-save信号处理程序中重置“已验证”字段。然而,在几乎所有用例中,使用信号似乎都被认为是一种反模式。相反,应该覆盖该方法。但仍然在覆盖时,我必须以某种方式手动确定。否则我不知道哪些字段发生了变化。update_fieldssave()save()saveupdate_fields

我怎样才能最容易地实现这样的事情。我更喜欢使用第三方包和自定义黑客的解决方案,或者不依赖于其他包的解决方案。但是,将django-model-utils monitorfield,django-dirtyfields用于自定义实现或等效的东西也可以。

标签: pythondjangopython-3.xdjango-models

解决方案


使用dirty-fields似乎最容易实现经过验证的字段。到目前为止,我想出了如下内容:

DJANGO-APP/models.py

from django.db import models
from dirtyfields import DirtyFieldsMixin


class VerifiedModel(DirtyFieldsMixin, models.Model):
    """
    Abstract class which allows to extend models with user verification model field.
    """
    ENABLE_M2M_CHECK = True
    verified = models.BooleanField(
        default=False,
        help_text="The verification status. True means meta-data is verified. False means meta-data is not verified. The verification status is reset to False whenever a field is set.",
    )

    def _update_verified_field(self):
        """
        To be called in inheriting model's save() method.
        """
        if self.is_dirty():
            if not 'verified' in self.get_dirty_fields():
                self.verified = False

    class Meta:
        abstract = True


class ModelToBeVerified(VerifiedModel):

    ...

    def save(self, *args, **kwargs):
        ...
        self._update_verified_field()
        return super(ModelToBeVerified, self).save(*args, **kwargs)

推荐阅读