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

时间:2018-09-06 04:07:45

标签: django

我有一个替代的用户模型和购物车模型。我希望一旦创建了用户模型实例,就会自动创建Cart模型实例。我正在尝试将新注册的用户传递到get_queryset方法中,但不知道如何执行。还有其他更好的方法吗?这是因为我可能需要对其他模型执行相同的操作,这与User模型不同,User模型的形式可以将值传递给get_queryset方法。

account / models.py:

class Cart(models.Model):

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

    def __str__(self):
        return self.user.email + '_cart'

帐户/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()

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

<form name="register" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Sign Up">
</form>

4 个答案:

答案 0 :(得分:6)

方法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)


方法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)

答案 1 :(得分:4)

使用连接到User模型的Django post_save signal

有关更多信息,请参见signals tutorial

答案 2 :(得分:0)

覆盖保存方法,信号难以读取/跟踪多个文件并且是同步的。

https://lincolnloop.com/blog/django-anti-patterns-signals/

class Pizza(models.Model):
has_pepperoni = models.BooleanField(default=False)

def save(self, *args, **kwargs):
    created = self.pk is None
    super(Pizza, self).save(*args, **kwargs)
    if created and self.has_pepperoni:
        ToppingSales.objects.filter(name='pepperoni').update(
            units_sold=F('units_sold') + 1)           


class ToppingSales(models.Model):
    name = models.CharField(max_length=100, unique=True)
    units_sold = models.PositiveIntegerField(default=0)

答案 3 :(得分:0)

我相信现代方法(根据文档)是在create()类方法期间执行此操作或编写自定义管理器。

https://docs.djangoproject.com/en/3.1/ref/models/instances/