es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
Tags:  , , ,

Answer

  1. Avatar for 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:

    class PostSerializer(serializers.ModelSerializer):
        authors = serializers.SerializerMethodField()
    
        class Meta:
            model = Post
            fields = ('id', 'title', 'authors')
    
        def get_authors(self, obj):
            member_qs = Member.objects.filter(workspace=obj.file.folder.workspace)
            author_names = [member.user.username for member in member_qs]
            return author_names
    

    En el código anterior, primero definimos authors como un SerializerMethodField(). Luego, en el método get_authors, hacemos una consulta al modelo Member 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:

    posts = Post.objects.all()
    serializer = PostSerializer(posts, many=True)
    result = serializer.data
    

Comments are closed.