РЕДАКТИРОВАТЬ: Я удалил весь «пример» кода и вставил только мой фактический код.
Когда я пытаюсь получить доступ к 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
больше не осуществлялся из какого-либо кеша?