Django中的隔离和并发

问题描述 投票:0回答:2

我在PostgreSQL上使用DjangoREST。我有以下两种模型:author / models.py:

class Author(models.Model):
     name = models.CharField(max_length=256)
     allsize =  models.FloatField(default=0)

以及在files / models.py中:

class File(models.Model):
     author =  models.ForeignKey(Author, on_delete=models.CASCADE)
     name = models.CharField(max_length=256)
     size = models.FloatField(default=0)

如果我上传多个具有相同大小的文件(从前端开始),为了更新作者的allsize字段(所有上传文件的总和),DjangoREST可能无法正确更新值。尽管我正在执行原始sql事务,但并发(它们的大小相同):

    with connection.cursor() as cursor:
        cursor.execute("BEGIN; set transaction isolation level read committed;"
                        "update author_author set allsize = allsize + %s where author_id = %s;",
                               [validated_data.get('size', 0), validated_data.get('author', 0)])
        cursor.execute("COMMIT;")
django-rest-framework postgresql-9.5 isolation-level
2个回答
0
投票
allsize字段实际上是数据的重复。该信息已存在于您的数据库中(与此用户相关的所有File.size的总和)。

如果要获取给定Author的此信息,则可以使用:

class Author(models.Model): name = models.CharField(max_length=256) def all_size(self): return self.aggregate(all_size=Sum('files__size')).all_size

这样,您就不会重复数据,并且是获取

aggregate]的简便方法Django docs中的更多资源


0
投票
我的SQL事务有效,我的代码有误。
© www.soinside.com 2019 - 2024. All rights reserved.