为了账号安全,请及时绑定邮箱和手机立即绑定

新创建的实例上不存在 Django 模型匹配查询

新创建的实例上不存在 Django 模型匹配查询

慕雪6442864 2022-06-14 17:50:31
因此,我看到在不同情况下发布了相同的问题,但我无法让我的工作。基本上试图找到一个模型实例,如果它已经存在并创建一个新实例,如果它不存在 - 基于实例是否与用户的用户名具有相同的字段我尝试了 get_object_or_404 甚至将主键更改为模型类中的字段。这是models.pyclass Cart(models.Model):    user = models.CharField(max_length=30)    @classmethod    def create(cls, user):        user = cls(user=user)        return user    def __str__(self):        """String for representing the Model object."""        return f'{self.id} {self.user}'这是views.pydef cart(request, pk):    try:        pizza = PizzaInstance.objects.get(id=pk)        # get the topping(s)        topping_1 = int(request.POST["topping1"])        topping = PizzaTopping.objects.get(pk=topping_1)        # get the username        user = request.user.username        # check if the user already has an order        try:            order = Cart.objects.get(user=user)        except KeyError:            order = Cart.create([user])            order.save()用户创建class RegistrationForm(UserCreationForm):    email = forms.EmailField(required=True)    class Meta:        model = User        fields = (            'username',            'first_name',            'last_name',            'email',            'password1',            'password2'        )    def save(self, commit=True):        user = super(RegistrationForm, self).save(commit=False)        user.first_name = self.cleaned_data['first_name']        user.last_name = self.cleaned_data['last_name']        user.email = self.cleaned_data['email']        if commit:            user.save()        return user我希望看到订单被保存,新实例被创建,甚至新实例被添加到购物车中。错误是 get is - 购物车匹配查询不存在。
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

有几个问题:

  1. request.user您应该使用而不是检索用户request.user.username(后者为您提供用户名,str而不是User实例。

  2. 您不应该真正使用自定义类方法创建对象。相反,使用对象管理器并调用Cart.objects.create(user=user)(如果您确实需要创建自定义create()函数,则应在自定义管理器类上定义它)。

通过这些更改,您应该能够使用Cart.objects.get_or_create(user=user),它返回一个包含您的Cart对象的元组和bool指示该对象是否已创建(即首先存在)。

所以放在一起:

def cart(request, pk):

    try:

        pizza = PizzaInstance.objects.get(id=pk)

        # get the topping(s)

        topping_1 = int(request.POST["topping1"])

        topping = PizzaTopping.objects.get(pk=topping_1)


        # get the user

        user = request.user


        # get the Cart object associated with 'user' or create a new one

        order, created = Cart.objects.get_or_create(user=user)


查看完整回答
反对 回复 2022-06-14
?
哔哔one

TA贡献1854条经验 获得超8个赞

尝试使用以下.get_or_create()方法:

cart, created = Cart.objects.get_or_create(...)


查看完整回答
反对 回复 2022-06-14
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

你在这里做一些奇怪的事情。


Cart.objects.get不会引发 KeyError。它会引发您看到的错误:Cart.DoesNotExist。这就是您需要捕获的错误。


此外,由于某种原因,user当您将它传递到 except 块时,您将它包装在一个列表中。不要那样做。


    try:

        order = Cart.objects.get(user=user)

    except Cart.DoesNotExist:

        order = Cart.create(user)

        order.save()


查看完整回答
反对 回复 2022-06-14
  • 3 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信