【问题标题】:saving in the database after return user?返回用户后保存在数据库中?
【发布时间】:2020-02-24 17:06:54
【问题描述】:

在这里,我基本上使用 Django 饼干切割器,为了能够使用自定义形状标志进行保存,我必须以这种方式进行,它有效,我不确定这是正确的继续方式,但我只找到了这个。我也用 def Signup() 进行了测试,但没有结果但是我意识到用户没有直接保存在数据库中,我在 alt_user 和 alt_user.name 之间放置了一个计时器。我注意到 User.object.get 给了我用户并且我可以修改用户的其余信息。但是当我查看我的数据库时,用户的备份只有在用户返回后才完成。用户是否在备份前被缓存?它带来的问题以及在保存 Alt_user.save() 后我会在芹菜任务中发送一个的 id 以进行更长的计算,提前谢谢你

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

【问题讨论】:

    标签: django python-3.x django-allauth


    【解决方案1】:

    问题是您的代码在数据库事务中运行。如果您的 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)
    

    【讨论】:

    • 感谢您的回答和花时间了解,我也去#django频道寻求帮助,我可以得到与您相同的答案:),我以为我不会在这里没有得到答案,因为我像西班牙牛一样解释自己。
    • 我觉得你解释得很好,或者我对西班牙奶牛的理解比预期的要好得多;)
    猜你喜欢
    • 2016-04-25
    • 2019-06-08
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2021-08-22
    • 1970-01-01
    • 2016-03-06
    相关资源
    最近更新 更多