【问题标题】:Are new_or_get and get_or_create the same?new_or_get 和 get_or_create 是一样的吗?
【发布时间】: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_create raises 多个对象返回。如果找不到对象,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_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

【问题讨论】:

    标签: python python-3.x django django-models get


    【解决方案1】:

    老实说,如果你能在 new_or_get 上找到文档,我会感到惊讶,因为它是一个定制功能。

    new_or_get 方法的作用是,如果 cart_id 查询集中只有 1 个对象,则不创建新对象;您将获得查询集中的第一个对象(应该是购物车),如果当前用户已登录,则将其保存。否则,您将创建一个新的购物车。 Cart_obj 是接收/创建的购物车对象,new_obj 是关于是否创建新购物车的布尔值。

    这与标准的get_or_create 方法非常相似。不同之处在于get_or_create 仅在找到对象时才返回对象,但您的new_or_get 会更精细地处理对象,因为它涉及身份验证和会话——get_or_create 没有提供这些对象。否则,两个返回的对象几乎是等价的。

    【讨论】:

    • 感谢您的帮助,在阅读了您的评论后,我重新评估了我的代码并且有了脑电波。
    猜你喜欢
    • 2017-04-26
    • 2010-11-15
    • 2021-07-15
    • 2019-06-02
    • 2016-03-06
    • 2014-10-23
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多