我正在寻找一种可靠的方法来确保对于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数据库服务器。
我试图不惜一切代价避免锁定,因此任何使用应用程序锁定的解决方案都不行。
感谢您的帮助。
答案 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
。