Проблема при запросе глубоко вложенного связанного поля в сериализаторе django
У меня есть модели с глубокой вложенной связанной моделью, которая выглядит следующим образом:
class User(models.Model):
username = models.Charfield(max_length=20)
...
class Workspace(models.Model):
...
class Folder(models.Model):
workspace = models.ForeignKey(Workspace, on_delete=models.CASCADE)
class File(models.Model):
folder = models.ForeignKey(Folder, on_delete=models.CASCADE)
class Member(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
workspace = models.ForeignKey(Workspace, related_name="members", on_delete=models.CASCADE)
class Post(models.Model):
file = models.ForeignKey(File, on_delete=models.CASCADE)
Теперь мой вопрос в том, как я могу получить результат запроса Post, который выглядит следующим образом:
{
"id": 1,
"file" 2,
"members" : [1,2,3]
}
Я пытался использовать SlugRelatedField в сериализаторе, но не могу добиться правильного результата.
Вы можете добавить метод свойства к вашей модели Post.
что-то вроде этого:
@property
def users(self):
return self.file.folder.workspace.members
И добавьте поле 'users' в сериализатор Post как обычное поле.
Я придумал ответ, хотя не знаю, является ли это оптимальным решением, но я использую поле SerializerMethod.
authors = serializers.SerializerMethodField()
def get_authors(self, obj):
print(self)
print(obj)
workspace = obj.file.folder.workspace.id
return Member.objects.filter(workspace=workspace).values(
uid=F("user__id"), first_name=F("user__first_name"), last_name=F("user__last_name")
)