Выделение и совпадение в Django - PullRequest
0 голосов
/ 11 апреля 2020

Я использую DjangoREST с PostgreSQL. У меня есть эти две модели: author / models.py:

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

и в файлах / 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 не обновил правильно значения, возможно, в соответствии с параллелизмом (они имеют одинаковый размер), несмотря на то, что я делаю raw 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;")

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

моя SQL транзакция работает, в моем коде произошла ошибка.

0 голосов
/ 11 апреля 2020
Поле

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

Таким образом, у вас нет дублирования данных, и вы можете легко получить совокупность

Больше ресурсов в Django документах

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