Невозможно назначить пользователя для объекта модели, который изменил объект модели - PullRequest
0 голосов
/ 07 марта 2020

Я использую django-simple-history для ведения истории изменений моей модели.

Я пытаюсь связать пользователя, меняющего объект службы, используя предложенный способ здесь

models.py

class UserTrackMixin(models.Model):

    changed_by = models.ForeignKey(User, null=True, on_delete=models.DO_NOTHING)

    @property
    def _history_user(self):
        return self.changed_by

    @_history_user.setter
    def _history_user(self, value):
        self.changed_by = value

    class Meta:
        abstract = True


class Service(BaseModel, UserTrackMixin):
    name = models.CharField(max_length=200)
    serviceType = models.CharField(max_length=200)

    history = HistoricalRecords()

Но, когда я пытаюсь присвоить объект пользователя атрибуту _history_user объекту обслуживания, выдается ошибка, как указано ниже.

u1=User.objects.first()
<User: User object (07ab8565-26c7-4bfa-a92e-e12bf924160a)>
s._history_user = u1
s.save()

ValueError: Cannot assign "<User: User object (07ab8565-26c7-4bfa-a92e-e12bf924160a)>": "HistoricalService.history_user" must be a "User" instance.

Затем я попробовал это:

s.changed_by = u1
s.save()

Это также дало ту же ошибку.

u1 это экземпляр пользователя, тогда почему он дает эту ошибку?

Ответы [ 2 ]

1 голос
/ 07 марта 2020

_history_user используется внутренним django-simple-history, вам не нужно вызывать его (следовательно, _ как префикс функции)

Используйте взамен changed_by:

u1 = User.objects.first()
s.changed_by = u1
s.save()
0 голосов
/ 08 марта 2020

Проблема была с моим кодом.

У меня не было переменной AUTH_USER_MODEL, определенной в файле настроек, из-за которой история принимает в качестве пользователя по умолчанию 'auth.User', что можно увидеть здесь, которое не пользовательская модель, которую я использую, так как я определил свою пользовательскую модель.

Итак, мне нужно явно указать модель пользователя, которую я использую для отслеживания пользователей.

Окончательный код:

    @property
    def _history_user(self):
        return self.changed_by

    @_history_user.setter
    def _history_user(self, value):
        self.changed_by = value

    history = HistoricalRecords(user_model=User)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...