亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

新創建的實例上不存在 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 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號