Как я могу внедрить проверенное поле в django? - PullRequest
0 голосов
/ 25 марта 2020

В Django Я хотел бы добавить поле «проверено» типа BooleanField в мои модели, которое должно указывать, был ли текущий экземпляр модели проверен пользователем-сотрудником или нет. Всякий раз, когда поле экземпляра модели, отличное от «проверенного» поля, изменяет проверенное значение поля, должно быть сброшено на False. Всякий раз, когда было изменено только «проверенное» поле, его значение должно быть принято как есть (большую часть времени True, но потенциально False также).

Одной из возможностей будет сброс «проверенного» поле в post-save обработчиках сигналов с учетом update_fields, переданных save(). Однако использование сигналов, по-видимому, считается анти-паттерном почти во всех случаях использования. Вместо этого следует переопределить метод save(). Но все же при переопределении save мне придется как-то определять update_fields вручную. В противном случае у меня нет информации о том, какие поля изменились.

Как мне проще всего реализовать что-то подобное. Я бы предпочел решение, использующее сторонний пакет с пользовательскими взломами или решение без каких-либо зависимостей от других пакетов. Однако использование django-model-utils monitorfield, django-dirtyfields для пользовательской реализации или чего-то подобного также будет в порядке.

1 Ответ

0 голосов
/ 26 марта 2020

Использование 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)
...