Django: QuerySet.update() возвращает FieldError при использовании Count() с фильтром
Учитывая, что:
class User(models.Model):
organization = models.ForeingKey(
"Organization",
related_name="users",
...
)
is_active = models.BooleanField(default=True)
class Organization(models.Model):
user_count = models.IntegerField(default=0)
Когда я запускаю это, если мы запускаем только строку 2 или 3, обе терпят неудачу:
# Line: 1
active_count = Count("users", filter=Q(users__is_active=True))
# Line: 2
Organization.objects.update(user_count=active_count)
# Line: 3
Organization.objects.annotate(num_users=active_count).update(user_count=F("num_users")
Я получаю следующую ошибку:
FieldError: Joined field references are not permitted in this query
Аннотирование (annotate()) вместо обновления, работает просто отлично.
Я не смог найти примеры такого решения с использованием Subquery()
Какова альтернатива этому требованию? Возможно, я совершаю ошибку в проектировании?
Я решил эту проблему, сделав следующее:
customers = Customer.objects.annotate(
auc=Count("users", filter=Q(users__is_active=True))
).values("pk", "auc")
customers = [Customer(pk=c["pk"], active_user_count=c["auc"]) for c in customers]
Customer.objects.bulk_update(customers, ["active_user_count"])
Все еще не уверен, что это лучший ответ, но он эффективно решает проблему для 2 запросов.