сохранение в базе данных после возвращения пользователя? - PullRequest
1 голос
/ 29 октября 2019

здесь я использую, по сути, формочку для печенья Django, чтобы иметь возможность сохранять с пользовательским знаком формы, мне нужно было действовать таким образом, это работает, я не уверен, что это правильный путь, но я нашел только этот. Я также проверил с помощью метода Registration (), но без результатов. Но я понял, что пользователь не сохраняется напрямую в базе данных для этого теста. Я установил таймер между alt_user и alt_user.name. Я заметил, что User.object.get дает мне пользователя и что я могу изменить остальную информацию пользователя. Но когда я смотрю на свою базу данных, резервное копирование пользователя выполняется только после его возвращения. Кэшируется ли пользователь перед резервным копированием? Проблема в том, что после сохранения Alt_user.save () я отправляю его идентификатор, если в задаче сельдерея для более длительного расчета, заранее спасибо

User = get_user_model()

class CustomSignupForm(SignupForm):
    name = CharField( max_length=255)
    forename = CharField( max_length=255)
    street = CharField( max_length=255)
    street_number = IntegerField()
    city = CharField(max_length=255)
    country = CountryField().formfield()
    phone_number = IntegerField()
    date_of_birth = DateField()
    affiliate_link = IntegerField(required=False)
    class Meta:
        model = get_user_model()  # use this function for swapping user model

    def save(self, request):
        # Ensure you call the parent class's save.
        # .save() returns a User object.
        user = super(CustomSignupForm, self).save(request)
        alt_user = User.objects.get(pk=user.id)
        time.sleep(30)
        alt_user.name = self.cleaned_data['name']
        alt_user.forename = self.cleaned_data['forename']
        alt_user.street = self.cleaned_data['street']
        alt_user.street_number = self.cleaned_data['street_number']
        alt_user.city = self.cleaned_data['city']
        alt_user.country = self.cleaned_data['country']
        alt_user.phone_number = self.cleaned_data['phone_number']
        alt_user.date_of_birth = self.cleaned_data['date_of_birth']
        alt_user.save()
        calculate_user_in_matrix.delay(alt_user.id)
        return user

1 Ответ

2 голосов
/ 29 октября 2019

Проблема в том, что ваш код выполняется в транзакции базы данных. Если ваш работник из Celery быстро выполняет задачу, транзакция еще не завершена. Пользователь, которого вы только что создали, не виден за пределами транзакции, пока она не будет зафиксирована.

Решение заключается в использовании крюка django.db.transaction.on_commit:

from django.db import transaction

class CustomSignupForm(SignupForm):
    ...
    def save(self, request):
        ...
        alt_user.save()
        transaction.on_commit(calculate_user_in_matrix.s(alt_user.id).delay)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...