猿问

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

因此,我看到在不同情况下发布了相同的问题,但我无法让我的工作。基本上试图找到一个模型实例,如果它已经存在并创建一个新实例,如果它不存在 - 基于实例是否与用户的用户名具有相同的字段


我尝试了 get_object_or_404 甚至将主键更改为模型类中的字段。


这是models.py


class 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.py


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 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 - 购物车匹配查询不存在。


慕雪6442864
浏览 149回答 3
3回答

哆啦的时光机

有几个问题:request.user您应该使用而不是检索用户request.user.username(后者为您提供用户名,str而不是User实例。您不应该真正使用自定义类方法创建对象。相反,使用对象管理器并调用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)

哔哔one

尝试使用以下.get_or_create()方法:cart, created = Cart.objects.get_or_create(...)

慕莱坞森

你在这里做一些奇怪的事情。Cart.objects.get不会引发 KeyError。它会引发您看到的错误:Cart.DoesNotExist。这就是您需要捕获的错误。此外,由于某种原因,user当您将它传递到 except 块时,您将它包装在一个列表中。不要那样做。    try:        order = Cart.objects.get(user=user)    except Cart.DoesNotExist:        order = Cart.create(user)        order.save()
随时随地看视频慕课网APP

相关分类

Python
我要回答