Как сгладить вложенные значения с помощью Django?

Я пытаюсь получить плоский список имен сайтов, связанных с каждым пользователем. Результаты будут записаны в файл CSV:

      email,sites
a@b.com,site1|site2|site3
b@b.com,site3

Выражение «usersite__site__name» работает, когда я не пытаюсь агрегировать, экспортируя одну строку для каждого сайта пользователя. С ExpressionWrapper или без него он выдает ошибку, которая 'WhenNode' object has no attribute 'copy'.

РЕДАКТИРОВАТЬ: Думаю, я слишком упростил свой пример кода. Есть еще три аннотации, и, по-видимому, одна из них вызывает конфликт. Другие аннотации работают нормально, прежде чем я добавляю одну StringAgg, а StringAgg работает, если я удаляю остальные. Я исследую, могу ли я сузить круг вопросов.

РЕДАКТИРОВАТЬ 2: поле created_date работает с StringAgg; isAdmin + StringAgg выдает ошибку.

Упрощенный код:

      users = (
    account.get_users()
    .annotate(
        isAdmin=ExpressionWrapper(Q(role=1), output_field=BooleanField()),
        created_date=Func(F("created_at"),Value("YYYY-MM-DD"),function="to_char", output_field=CharField()),
        sites=StringAgg('usersite__site__name', delimiter="|"),
    )
    .values_list(
        "email",
        "isAdmin",
        "created_date",
        # "usersite__site__name",
        "sites",
    )
    .order_by("email")
)

class UserSite():
    class Meta(object):
        unique_together = ("user", "site")

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    site = models.ForeignKey(Site, on_delete=models.CASCADE)

Это запрос, зарегистрированный Django, когда я не сглаживаю имя сайта:

      SELECT
    "user"."email",
    "index_site"."name",
FROM "user"
INNER JOIN "index_userprofile" ON ("user"."id" = "index_userprofile"."user_id")
LEFT OUTER JOIN "index_usersite" ON ("user"."id" = "index_usersite"."user_id")
LEFT OUTER JOIN "index_site" ON ("index_usersite"."site_id" = "index_site"."id")
WHERE "index_userprofile"."account_id" = 1
ORDER BY "user"."email" ASC

0 ответов

Другие вопросы по тегам