Django иногда получает результаты поиска ManyToManyField из своего рода кеша - PullRequest
0 голосов
/ 30 июня 2019

РЕДАКТИРОВАТЬ: Я удалил весь «пример» кода и вставил только мой фактический код.

Когда я пытаюсь получить доступ к ManyToManyField с through=, указанным с использованием имени поля, результаты берутся из какого-то кеша, а не из базы данных.

Это мои модели с пропущенными ненужными полями:

class Assay(models.Model):
    name = models.CharField(max_length=255, default='Example assay name')
    departments = models.ManyToManyField("Department",
        through="Department_assay",
        related_query_name='department',
        related_name='assays'
    )
    def __str__(self):
        return self.name

class Department(models.Model):
    name = models.CharField(max_length=255, default='Example Department name')
    def __str__(self):
        return self.name

class Department_assay(models.Model):
    department = models.ForeignKey(Department, models.CASCADE)
    assay = models.ForeignKey(Assay, models.CASCADE)
    # And some more additional data, which is unrelated

Теперь давайте попробуем получить доступ к некоторым из них.

>>> for o in Assay.objects.all():
...     print(o.departments.all())
...
<QuerySet [<Department: Biochemistry>]>
<QuerySet [<Department: Biochemistry>]>
<QuerySet [<Department: Biochemistry>]>
<QuerySet [<Department: Biochemistry>]>
<QuerySet [<Department: Biochemistry>]>
<QuerySet [<Department: Biochemistry>]>
>>> # So it says i have 6 Assays each having the same single Department.
>>> # Now let's try to access these using *_set attribute of the Assay.
>>> for assay in Assay.objects.all():
...     print('Assay name: ' + assay.name)
...     print('departments: ' + str([o.department for o in assay.department_assay_set.all()]))
...
Assay name: ASAT / SGOT (ASPARTATE AMINOTRANSFERASE)
departments: []
Assay name: HCV
departments: [<Department: Allergology>]
Assay name: HBA1C
departments: []
Assay name: ALAT / SGPT (ALANINE AMINOTRANSFERASE)
departments: [<Department: Genetics>]
Assay name: Hepatite C RNA quantitative
departments: []
Assay name: Hepatite C RNA qualitative
departments: []
>>> # Now it shows my actual rows in database:
>>> # 2 of 6 Assays have one different Department each, rest has no Departments at all.
>>> Assay.objects.get(name="HCV").departments.all()
<QuerySet [<Department: Biochemistry>]>
>>> # What's this?
>>> Assay.objects.get(name="HCV").department_assay_set.all()[0].department
<Department: Allergology>
>>> # And we're back to normal

Теперь эту проблему трудно воспроизвести. Одна из возможных причин, которая пришла мне в голову, заключается в том, что это приводит к путанице, когда вы играете с редактированием модели, запуском приложения, а затем редактированием его обратно (без миграций в середине).

Есть ли возможное решение, чтобы доступ к набору через .departments, а не через .department_assay_set....department больше не осуществлялся из какого-либо кеша?

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