确保django模型字段只写一次?无锁定保证原子性

时间:2016-11-27 16:17:04

标签: python django celery atomic atomicity

我正在寻找一种可靠的方法来确保对于django模型的给定实例,特定字段只写一次。

代码应该使用celery甚至rq。

在两个视图或任务中运行

我正在考虑使用以下代码段:

from django.db import transaction
from django.utils.timezone import now

...

def perform_writeonce(object_pk):
    with transaction.atomic():
        instance = MyModel.objects.get(pk=object_pk)

        if instance.value is None:
            instance.value = 'Value written now : {}'.format(now())
            instance.save()

目标是只应写入一次值,并且只有值为None。

你对这个片段有信心还是我错过了什么?

我正在使用多个gunicorn实例和芹菜工作者使用一个postgresql数据库服务器。

我试图不惜一切代价避免锁定,因此任何使用应用程序锁定的解决方案都不行。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

我正在寻找一种可靠的方法来确保对于任何给定的django模型实例,特定字段只写一次。

     

预期的行为类似于datefields的auto_now_add选项。

auto_now_add无法确保字段仅写入一次。如果你真的想,你仍然可以写入该字段。它只是默认情况下不显示在管理表单等中。

您可以通过设置Field.editable对其他字段执行相同的操作 https://docs.djangoproject.com/en/1.10/ref/models/fields/#editable

  

<强> Field.editable

     

如果False,该字段将不会显示在管理员或任何其他字段中   ModelForm。在模型验证期间也会跳过它们。默认是   True