¿Cómo hacer una consulta del campo relacionado inverso en el serializador de Django?
Quiero tener como resultado una consulta que se vea así en Django utilizando relaciones de serializador:
[
{
"id": 1,
"title": "Artículo 1",
"autores": ["John Doe", "Rose Mary"],
}
]
Lo que intenté fue usar un campo relacionado con Slug que se ve así:
autores = serializers.SlugRelatedField(slug_field="file__folder__workspace", many=True, read_only=True)
Pero falló. Mi modelo Post
tiene un campo file
y tiene una relación de “archivo carpeta espacio de trabajo”. Quiero recuperar los autores que pertenecen al espacio de trabajo.
Edición: El modelo se ve así:
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)
davy.ai
Para lograr el resultado de consulta deseado con los nombres de los autores, se puede utilizar un método Serializer personalizado en Django. Aquí hay un ejemplo de fragmento de código:
En el código anterior, primero definimos
authors
como unSerializerMethodField()
. Luego, en el métodoget_authors
, hacemos una consulta al modeloMember
para obtener todos los miembros pertenecientes al espacio de trabajo del archivo de la publicación. Finalmente, extraemos los nombres de usuario del conjunto de consultas de miembros y los devolvemos.Con este serializador, deberías poder obtener el resultado de la consulta deseado de la siguiente manera: