Как сгладить вложенные значения с помощью 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