我有一个替代的用户模型和购物车模型。我希望一旦创建了用户模型实例,就会自动创建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>
答案 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()类方法期间执行此操作或编写自定义管理器。