I have a model in django named Courses and it has a ManyToManyField which is related to the teachers Model. now in the views file I'm gonna make an APIView to return a list of courses which each courses has a field that returns teachers names in String which is separated by comma. I wanna use annotate and I used Concat to return each courses and in this Concat I used an ArrayAgg to return a list of teachers name.
it raises this error:
django.core.exceptions.FieldError: Cannot compute None('Concat(ConcatPair(Value('{"uuid": '), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__pk)), ConcatPair(Value('",'), ConcatPair(Value('"title":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_title)), ConcatPair(Value('",'), ConcatPair(Value('"courseType":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_category__category_name)), ConcatPair(Value('",'), ConcatPair(Value('"rate":'), ConcatPair(Cast(F(courses__course_rate)), ConcatPair(Value(','), ConcatPair(Value('"price":'), ConcatPair(Cast(F(courses__course_price)), ConcatPair(Value(','), ConcatPair(Value('"discount":'), ConcatPair(Cast(F(courses__course_discount)), ConcatPair(Value(','), ConcatPair(Value('"isWishedList":'), ConcatPair(Value('"'), ConcatPair(Value('",'), ConcatPair(Value('"imageUri":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_main_image)), ConcatPair(Value('",'), ConcatPair(Value('"teachers":'), ConcatPair(StringAgg(F(courses__course_teacher__name), Value(', '), distinct=True), ConcatPair(Value(','), ConcatPair(Value('"institution":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_institution__name)), Value('"}'))))))))))))))))))))))))))))))))))))'): 'Concat(ConcatPair(Value('{"uuid": '), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__pk)), ConcatPair(Value('",'), ConcatPair(Value('"title":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_title)), ConcatPair(Value('",'), ConcatPair(Value('"courseType":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_category__category_name)), ConcatPair(Value('",'), ConcatPair(Value('"rate":'), ConcatPair(Cast(F(courses__course_rate)), ConcatPair(Value(','), ConcatPair(Value('"price":'), ConcatPair(Cast(F(courses__course_price)), ConcatPair(Value(','), ConcatPair(Value('"discount":'), ConcatPair(Cast(F(courses__course_discount)), ConcatPair(Value(','), ConcatPair(Value('"isWishedList":'), ConcatPair(Value('"'), ConcatPair(Value('",'), ConcatPair(Value('"imageUri":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_main_image)), ConcatPair(Value('",'), ConcatPair(Value('"teachers":'), ConcatPair(StringAgg(F(courses__course_teacher__name), Value(', '), distinct=True), ConcatPair(Value(','), ConcatPair(Value('"institution":'), ConcatPair(Value('"'), ConcatPair(Cast(F(courses__course_institution__name)), Value('"}'))))))))))))))))))))))))))))))))))))' is an aggregate
I changed th code and replaced ArrayAgg with Subquery, it works good but I want a list of teachers name but it returns a dict like "{"value1", "value2"}" instead. this is my code with Subquery:
Subquery(ArchSchoolCourse.objects.prefetch_related("course_teacher").filter(
pk=OuterRef('courses__pk')
).annotate(
course_teachers=GroupConcat("course_teacher__name", distinct=True, separator=",") if settings.DB_ENGINE == "django.db.backends.mysql"
else ArrayAgg("course_teacher__name", distinct=True) if settings.DB_ENGINE == "django.db.backends.postgresql" else None,
).values_list("course_teachers", flat=True).all()),
let's suppose your model looks like this
what you are trying to do can be achieved by using the serializers
Now you can access list of courses with each course having list of teacher