Django - 在创建另一个模型实例时自动创建模型实例

Jin*_*inx 3 django

我有一个重写的用户模型和购物车模型.我希望在创建User模型实例后自动创建Cart模型实例.我试图将新注册的用户传递给get_queryset方法,但不知道如何做到这一点.还有其他更好的方法吗?这是因为我可能需要为其他模型做同样的事情,而不像User模型有一个可以将值传递给get_queryset方法的形式.

帐户/ models.py:

class Cart(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.user.email + '_cart'
Run Code Online (Sandbox Code Playgroud)

帐户/ views.py:

class RegisterView(generic.CreateView):
    template_name = 'account/register.html'
    form_class = RegisterForm
    success_url = reverse_lazy('book:home')

    def get_queryset(self):
        sign_up = self.request.POST.get('register')
        if sign_up:
            c = Cart.objects.create(user=???)
            c.save()
Run Code Online (Sandbox Code Playgroud)

帐户/模板/帐号/ register.html:

<form name="register" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Sign Up">
</form>
Run Code Online (Sandbox Code Playgroud)

JPG*_*JPG 8

方法-1:使用Django的post_save信号(如@AKX所说)

from django.contrib.auth import get_user_model


@receiver(post_save, sender=get_user_model())
def create_user_cart(sender, instance, created, **kwargs):
    if created:
        Cart.objects.create(user=instance)
Run Code Online (Sandbox Code Playgroud)


方法2:覆盖用户模型扩展用户模型save()方法

class MyUserModel(....):
    # your code
    def save(self,*args,**kwargs):
        created = not self.pk
        super().save(*args,**kwargs)
        if created:
            Cart.objects.create(user=self)
Run Code Online (Sandbox Code Playgroud)

  • 对于要创建的实例,@LuisRodriguez `self.pk` 将是 **`None`** 。 (3认同)

AKX*_*AKX 5

使用连接到模型的Django post_save信号User

有关更多信息,请参见信号教程