Почему агрегации не работают корректно в миграциях Django?
Когда я импортирую настоящую модель и выполняю на ней запрос, я получаю правильный ответ. Когда я использую поддельную "историческую" модель из apps.get_model()
, я получаю неправильный ответ.
Миграция
from django.db import migrations
from django.db.models import Count
from advisors.models import PlanShareRequest
print(PlanShareRequest.objects.values("advisor_id", "plan_id").annotate(cnt=Count('id')).filter(cnt__gt=1))
def forward(apps, schema_editor):
PlanShareRequest = apps.get_model("advisors", "plansharerequest")
print(PlanShareRequest.objects.values("advisor_id", "plan_id").annotate(cnt=Count('id')).filter(cnt__gt=1))
class Migration(migrations.Migration):
dependencies = [
('plans', '0037_autoshare'),
("advisors", "0046_drop_advisor_logout"),
]
operations = [
migrations.RunPython(forward, migrations.RunPython.noop),
]
Выход
odigity@mypc:~/src/proj$ ./manage.sh migrate advisors 0047
<QuerySet [{'advisor_id': UUID('46bb6c3c-dfb6-40b2-9fd3-4cb5c413bf8a'), 'plan_id': UUID('9c789523-3319-4b2c-8192-27b43b2d5991'), 'cnt': 2}]>
Operations to perform:
Target specific migration: 0047_plansharerequest_unique, from advisors
Running migrations:
Applying advisors.0047_plansharerequest_unique...<QuerySet []>
OK
Update
То же самое происходит с distinct()
.
Если я запущу это в оболочке Django:
print(len(PlanShareRequest.objects.values("advisor_id", "plan_id")))
print(len(PlanShareRequest.objects.values("advisor_id", "plan_id").distinct()))
я получаю 115 и 114 соответственно. Но если я запускаю его внутри миграции, используя модель из apps.get_model()
, я получаю 115 и 115. distinct()
ничего не делает.