Постоянный slug в Django

В моем веб-приложении Django у каждого пользователя есть случайно сгенерированный токен, созданный для целей, выходящих за рамки данного вопроса.

Это соответствующая модель Profile

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,max_length=30)
    verified_account = models.BooleanField(default=False)
    verify_token = models.SlugField(max_length=15, blank=True, null=True, unique=True)

    def __str__(self):
       return self.user.username

    def get_absolute_url(self):
        return reverse('user:profile', kwargs={'pk': self.pk})

    def generate_token(self): #important
        from django.utils.crypto import get_random_string
        self.verify_token = get_random_string(length=15)
        return self.verify_token

    def save(self, *args, **kwargs): # also important
        self.slug = slugify(self.user.username)
        self.generate_token() # issue is here
        super().save(*args, **kwargs)

So basically, whenever a Profile object is created (on the creation of the User model), a token is randomly generated. However, whenever the Profile model is updated, so is the verify_token. Below is the code for my @receiver that handles user creation

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    else:
        instance.profile.save()

I have tried to insert the following code below the Profile.objects.create(user=instance) line in order to try and get it to only generate the token when the Profile is created

Profile.objects.filter(user=instance).generate_token()

Но это дает мне следующую ошибку

'QuerySet' object has no attribute 'generate_token'

Какой лучший способ обеспечить, чтобы slug не изменялся после каждого обновления модели Profile?

Заранее благодарю за любые решения

Просто добавить поле slug только для чтения? Также, причина, по которой вы получаете ошибку, заключается в том, что .filter() дает вам набор запросов, а не экземпляр.

Profile.objects.filter(user=instance).get().generate_token()

должно работать

Спасибо Ишику Каплану за предоставление основы для моего решения.

В итоге я просто добавил условие в функцию save() - if self.verify_token is None:

Еще раз спасибо!

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