簡體   English   中英

new_or_get 和 get_or_create 是一樣的嗎?

[英]Are new_or_get and get_or_create the same?

這是我的代碼。

視圖.py

cart_obj, cart_created = Cart.objects.new_or_get(request)

模型.py

def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        qs = self.get_queryset().filter(id=cart_id)
        if qs.count() == 1:
            new_obj = False
            cart_obj = qs.first()
            if request.user.is_authenticated() and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:
            cart_obj = Cart.objects.new(user=request.user)
            new_obj = True
            request.session['cart_id'] = cart_obj.id
        return cart_obj, new_obj

我想了解cart_obj, cart_created是什么意思。 我用谷歌搜索並找到了以下內容。

  • 傳遞給get_or_create()的任何關鍵字 arguments —— 除了一個稱為 defaults 的可選關鍵字——將在get()調用中使用。 如果找到 object, get_or_create()將返回該 object 和 False 的元組。 如果找到多個對象, get_or_create將引發 MultipleObjectsReturned。 如果沒有找到 object, get_or_create()將實例化並保存一個新的 object,返回一個新的 object 和 True 的元組。 新的 object 將大致按照這個算法創建:

我認為上面的描述描述了我的代碼中發生的事情(或者至少描述了與我的代碼正在做的事情非常相似的事情)。 但在我的代碼中,我使用new_or_get而上面的描述與get_or_create

我在代碼中添加了兩個打印語句,以便更好地理解它。

cart_obj, cart_created = Cart.objects.new_or_get(request)
print("cart created")
print(cart_created)

在我的代碼中, cart_created似乎是一個 boolean 值(在上述與get_or_create相關的描述中提到過)。

所以我的問題是, get_or_createnew_or_get是一樣的嗎? 如果它們不一樣,有什么區別? 我找到了與get_or_create但不是new_or_get相關的文檔。

更新

我沒有意識到(1)cart_obj的值將傳遞給(a)cart_obj ,而(2)new_obj的值將傳遞給(b)cart_created 為了在我的代碼中澄清,我實際上沒有'(1)(2)(a)(b)',它是為了評論而完成的,因為我在views.py和models.py中使用cart_obj

我沒有意識到cart_objcart_creatednew_obj都只是任意名稱。

(a)cart_obj, (b)cart_created =

return (1)cart_obj, (2)new_obj

當我將代碼更改為下面的代碼並且它仍然有效時,我才發現它們是任意名稱。

return cart_obj, new_objtest

老實說,如果你能在new_or_get上找到文檔,我會感到驚訝,因為它是定制的 function。

new_or_get 方法的作用是,如果 cart_id 查詢集中只有 1 個cart_id ,則不要創建新的 object; 您將獲得查詢集中的第一個 object - 它應該是一個購物車 - 如果當前用戶已登錄,則保存它。否則,您將創建一個新的購物車。 Cart_obj是接收/創建的購物車 object 和new_obj是關於是否創建新購物車的 boolean。

這與標准的get_or_create方法非常相似。 不同之處在於get_or_create僅在找到時返回 object 但您的new_or_get處理對象更精細,因為它涉及身份驗證和會話- get_or_create沒有。 否則,兩個返回的對象幾乎是等價的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM