django管理更改视图中的并发性

django管理更改视图中的并发性,django,django-models,concurrency,django-admin,optimistic-concurrency,Django,Django Models,Concurrency,Django Admin,Optimistic Concurrency,我的模型: class Order(models.Model): property_a = models.CharField() property_b = models.CharField() property_c = models.CharField() 许多用户将通过管理员更改页面在短时间内访问给定记录,因此我遇到并发问题: 用户1和2同时打开更改页面。假设加载页面时所有值均为空。用户1将属性_a设置为“a”,将属性_b设置为“b”,然后保存。一秒钟后,如果用户2更

我的模型:

class Order(models.Model):
    property_a = models.CharField()
    property_b = models.CharField()
    property_c = models.CharField()
许多用户将通过管理员更改页面在短时间内访问给定记录,因此我遇到并发问题:

用户1和2同时打开更改页面。假设加载页面时所有值均为空。用户1将属性_a设置为“a”,将属性_b设置为“b”,然后保存。一秒钟后,如果用户2更改属性b,然后保存属性c,它将悄悄地覆盖用户1的所有值。在这种情况下,属性_a将返回为空,而b和c将是用户2输入的任何内容


我需要关于如何处理这个问题的建议。如果我必须在模型中有一个版本字段,我如何将其传递给管理员,我在哪里进行检查,以便能够优雅地通知用户由于其他用户修改了记录而无法保存其更改?除了向用户返回错误之外,还有更无缝的方法吗?

标准解决方案是防止用户共享单个记录。现在还不清楚为什么这么多用户在处理完全相同的
顺序
实例

考虑到
Order
可能是一个复合对象,并且您在单个模型中投入了太多。这是第一个也是最好的解决方案

如果(出于莫名其妙的原因)您不分解它,那么您必须创建一个由两部分组成的更新事务

  • 重新查询数据。与此用户会话的原始查询进行比较

  • 如果数据与原始查询不匹配,则其他人会对其进行更改。用户的更改将失效、回滚、删除,并且用户将看到一个新的查询

  • 如果数据不匹配,您可以尝试提交更改

  • 上述算法有一个竞争条件,通常通过低级SQL解决。请注意,它会使用户的工作无效,从而最大程度地让人恼火

    这就是为什么您的第一选择是分解模型以消除并发性


    我的模型有一个杂项注释字段

    这是一个糟糕的设计。(a) 此字段上的冲突破坏了并发性。(b) 没有日志或评论历史记录

    第(b)项表示行为不良的用户可以恶意破坏此数据。如果您将注释和注释作为日志保存,原则上可以限制用户仅更改自己的注释

    [在大多数具有“杂项注释”的数据库中,该字段已成为一个成本高昂、难以维护的负担,充满了重要但无法解析的数据。杂项注释是用户在应用软件之外发明自己的过程的地方。]

    “杂项注释”必须像日志一样处理,并在订单上附加无限数量的注释(日期戳,由用户标识)


    如果您只是将设计划分成一个单独的表,就可以解决并发问题

    标准解决方案是防止用户共享单个记录。现在还不清楚为什么这么多用户在处理完全相同的
    顺序
    实例

    考虑到
    Order
    可能是一个复合对象,并且您在单个模型中投入了太多。这是第一个也是最好的解决方案

    如果(出于莫名其妙的原因)您不分解它,那么您必须创建一个由两部分组成的更新事务

  • 重新查询数据。与此用户会话的原始查询进行比较

  • 如果数据与原始查询不匹配,则其他人会对其进行更改。用户的更改将失效、回滚、删除,并且用户将看到一个新的查询

  • 如果数据不匹配,您可以尝试提交更改

  • 上述算法有一个竞争条件,通常通过低级SQL解决。请注意,它会使用户的工作无效,从而最大程度地让人恼火

    这就是为什么您的第一选择是分解模型以消除并发性


    我的模型有一个杂项注释字段

    这是一个糟糕的设计。(a) 此字段上的冲突破坏了并发性。(b) 没有日志或评论历史记录

    第(b)项表示行为不良的用户可以恶意破坏此数据。如果您将注释和注释作为日志保存,原则上可以限制用户仅更改自己的注释

    [在大多数具有“杂项注释”的数据库中,该字段已成为一个成本高昂、难以维护的负担,充满了重要但无法解析的数据。杂项注释是用户在应用软件之外发明自己的过程的地方。]

    “杂项注释”必须像日志一样处理,并在订单上附加无限数量的注释(日期戳,由用户标识)


    如果您只是将设计划分成一个单独的表,就可以解决并发问题

    它是一种在短时间内由多个用户操纵订单的设置。因此,有时他们的编辑时间重叠,而他们却没有意识到。订单模型的字段实际上不能与其他模型分离(它都是一对一的信息)。如果这就是你所指的?我不确定我的问题/评论是否给人留下粗鲁/不恰当/不清楚的印象。如果是这样,我道歉,我真的不是故意的。尽管如此,我还是很感谢你的建议/专业知识,因为我是一个新手,但不是那种态度。如果你仍然愿意帮助我:我的模型有一个杂项注释字段。一个订单可以在大约一小时内由多台计算机上的多个用户编辑。我可以给他们单独的notes字段来避免这个并发问题,但我认为它真正的杂项信息应该放在一个字段中。请让我知道,如果我没有解释好。这是一个设置,一个命令是由一个以上的用户在短时间内操纵。因此,有时他们的编辑时间重叠,而他们却没有意识到。订单模型的字段实际上不能在整数中分隔