[英]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_create
和new_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_obj
、 cart_created
和new_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.