【问题标题】:Creating a unique dictionary key创建唯一的字典键
【发布时间】:2019-02-08 05:23:18
【问题描述】:

问题

我正在 Django 中进行电子商务,用户可以在将它们添加到购物车之前选择多个项目,当单击“添加到购物车”按钮时,我使用时间戳作为用户购物车中的对象 ID。

当点击添加到购物车按钮时,我有一个字典

{"item_id":"qty"}

创建购物车对象的过程如下

{"timestamp":"item_id;qty"}

时间戳用作唯一 id,因此如果需要删除购物车的行,我可以为它们提供 id,如果需要,则在后端发送购物车元素的 id 并从中删除相同的元素用户的购物车对象

时间戳不是唯一的...该过程太快以至于时间戳保持不变并且不会产生不同的键任何建议具有不同的时间戳将不胜感激。

【问题讨论】:

  • 我很困惑 - 你想解决什么问题? 必须您使用时间戳吗?您能否将同时创建的值存储在所述时间戳下的列表中?这可能是the XY problem 的一个例子。
  • 你为什么要四舍五入?
  • 为什么,是的,正如您所说,时间戳不是唯一的。因此,您必须为发生碰撞做好准备。也许让每个值成为可能值的列表
  • 因为您还没有为这些时间戳的用途添加上下文,而且我们怀疑我们在 XY problem 上浪费了时间。
  • ????‍♂️ Sooo……你只需要一个唯一的 id ‽ 你似乎根本不喜欢使用时间戳‽ 那为什么不使用合适的东西,比如 UUID ,或者只是一个list,它会有唯一的索引?

标签: python django python-3.x


【解决方案1】:

时间戳用作唯一 ID,因此如果需要删除购物车的行,我可以为它们提供 ID

你找错人了,试图在不适合原始问题的解决方案中解决问题;即你有一个XY problem

最简单的解决方案:使用list 而不是dictlist 根据定义将具有唯一键。 list 的唯一问题是,在 Web 场景中,您可能正在处理两个并行或过时的请求,并且索引在到达您的服务器时可能会引用不同的元素。

所以要使用真正唯一、不变的 ID,请使用 uuid module

from uuid import uuid4

a = [1 ,2 ,3 , 4 , 5]
b = {}
for i in a:
    b[uuid4()] = i

你去吧,保证唯一的 ID。

【讨论】:

    【解决方案2】:

    如果您希望您的密钥是唯一的并且在某种程度上是基于时间的,只需手动递增它们:

    import time
    key = time.time() * 1000
    a = [1 ,2 ,3 , 4 , 5]
    b = {}
    for i in a:
        b[key] = i
        key += 1
    
    print(b)
    

    【讨论】:

      【解决方案3】:

      如何使用datetime 模块

      from datetime import datetime
      
      for i in a:
          b[datetime.now()] = i
      

      编辑:

      也许更好的让它独一无二的方法是在时间戳中添加一个独特的元素。一种方法是将 UUID 添加到混合中。

      import uuid
      
      for i in a:
          b[timestamp() + uuid.uuid4()] = i
      

      但我可能有点夸张了。只是一个建议。

      【讨论】:

      • 好吧,这是一个可行的解决方案,为什么要投反对票?这不是题外话,它有效,我不会使用它,但它可以帮助 SO 中的某人
      • 我明白为什么我被否决了。它仍然没有解决使其独一无二的问题。
      猜你喜欢
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多