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 запросов.

Вернуться на верх