代码之家  ›  专栏  ›  技术社区  ›  ThunderHorn

创建唯一的字典键

  •  -7
  • ThunderHorn  · 技术社区  · 6 年前

    问题

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

    单击“添加到购物车”按钮时,我的口述为

    {"item_id":"qty"}
    

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

    {"timestamp":"item_id;qty"}
    

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

    时间戳不唯一…这个过程太快了,时间戳保持不变,而且它不会生成不同的键。任何建议都应该使用不同的时间戳。

    3 回复  |  直到 6 年前
        1
  •  5
  •   deceze    6 年前

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

    你找错了方向,试图用一个不适合原来问题的解决方案来解决问题;也就是说,你有一个 XY problem .

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

    因此,要使用真正独特、不变的ID,请使用 uuid module :

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

    给你,保证唯一的身份证。

        2
  •  0
  •   bereal    6 年前

    如果您希望您的密钥是唯一的,并且有些基于时间的,只需手动增加它们:

    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
  •  -1
  •   Wong Siwei    6 年前

    如何使用 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
    

    但我可能会把它拉长一点。只是个建议。