我在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;")
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中的更多资源