【发布时间】:2020-07-16 00:05:04
【问题描述】:
这是我的代码。
views.py
cart_obj, cart_created = Cart.objects.new_or_get(request)
models.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()的任何关键字参数——除了可选的 一个称为默认值——将在get()调用中使用。如果一个对象是 找到,get_or_create()返回该对象的元组和 False。如果 找到多个对象,get_or_createraises 多个对象返回。如果找不到对象,get_or_create()将实例化并保存一个新对象,返回一个新对象的元组 对象和真。新对象将大致根据创建 这个算法:
我认为上面的描述描述了我的代码中发生的事情(或者至少描述了与我的代码正在做的事情非常相似的事情)。但是在我的代码中,我使用了new_or_get,而上面的描述与get_or_create有关。
我在代码中添加了两个打印语句,以便更好地理解它。
cart_obj, cart_created = Cart.objects.new_or_get(request)
print("cart created")
print(cart_created)
在我的代码中,cart_created 似乎是一个布尔值(在上面与 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
【问题讨论】:
标签: python python-3.x django django-models get