Пытался обновить поле с экземпляром модели, <SimpleLazyObject:<<>>. Используйте значение, совместимое с CharField

Я пытаюсь обойти метод save в моей модели для хранения текущего зарегистрированного пользователя. Я использую django-current пользователя для получения аутентифицированного пользователя. Я написал такой код

from django_currentuser.middleware import (
    get_current_user, get_current_authenticated_user)

from django_currentuser.db.models import CurrentUserField

 uploaded_by = models.CharField(max_length=255, blank=True, null=True, editable=False)

 def save(self, *args, **kwargs):

     user = get_current_authenticated_user()

     self.uploaded_by = user

     super(Citation, self).save(*args, **kwargs)
   

Но я получаю эту ошибку

Tried to update field professional.Citation.uploaded_by with a model instance, <SimpleLazyObject: <CustomUser: staff@gmail.com>>. Use a value compatible with CharField.

Пожалуйста, подскажите, что мне делать, так как я хочу сохранить текущего зарегистрированного пользователя в методе сохранения модели, а также сохранить это поле не редактируемым.

Я получаю эту ошибку только при обновлении поля, при первом сохранении все работает нормально

Вы получаете эту ошибку, потому что пытаетесь сохранить пользовательский объект в поле char. Ваш файл uploaded_by является полем CharField. Вы можете сохранить только строковое значение в этом поле.

попробуйте это и, надеюсь, это решит ваши проблемы:

 from django.contrib.auth.models import User #import user model
 # add user ForeignKey fields in your model
 user = models.ForeignKey(User,on_delete=models.CASCADE) 
 uploaded_by = models.CharField(max_length=255, blank=True, null=True, editable=False)
   

    def save(self, *args, **kwargs):
    
         user = self.user.username

         if not self.uploaded_by:
             self.uploaded_by = user
    
         super(Citation, self).save(*args, **kwargs)

Вот как я преодолел ошибку

def save(self, *args, **kwargs):

        current_user = get_current_authenticated_user()
        
        user =CustomUser.objects.get(email = current_user)

        self.uploaded_by = user.email

        super(Citation, self).save(*args, **kwargs)
   

Здесь я получаю пользователя перед непосредственным сохранением с помощью get_current_authenticated_user() и затем сохраняю имя пользователя (в моем случае email).

def save_model(self, request, obj, form, change):
    if change:
        obj.updated_by = str(request.user)
    else:
        obj.created_by = str(request.user)
    return super().save_model(request, obj, form, change)

str() приведение типов работает.

Вернуться на верх