Как избежать состояния гонки в Django при присваивании целочисленному полю значения, основанного на значении, принадлежащем ОЧЕНЬ ПОСЛЕДНЕМУ аналогичному объекту в БД? - PullRequest
0 голосов
/ 25 июня 2018

Пример кода, показывающего проблему:

class Post(models.Model):
  ...

class Comment(models.Model):
  ...
  post = models.ForeignKey(Post, related_name='comments',
                      on_delete=models.CASCADE, null=False)
  post_comment_number = models.PositiveIntegerField(unique=True, null=False)

Скажем, каждый раз, когда мы создаем новый объект Comment для объекта Post, мы хотим присвоить полю post_comment_number значение, равное +1 от значения post_comment_number последнего комментария, созданного для того же объекта Post.

Я считаю, что выполнение следующих действий может привести к проблеме состояния гонки:

last_comment_for_post = Comment.objects.filter(post=post).order_by('-post_comment_number')[0]

comment = comment_form.save(commit=False)
comment.post_comment_number = last_comment_for_post.post_comment_number + 1
comment.save()

Как мы можем сделать это потокобезопасным способом, который не приведет к проблеме состояния гонки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...