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.

Problema en la consulta de campos relacionados profundamente anidados en el serializador de Django.

Tengo modelos anidados que se relacionan entre sí y que se ven 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)

Mi pregunta es: ¿Cómo puedo obtener un resultado de consulta para Post que se vea así?

{
  "id": 1,
  "file": 2,
  "members": [1, 2, 3]
}

Intenté usar SlugRelatedField en el serializador, pero no pude hacerlo correctamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener un resultado de consulta de publicación como el que desea, puede utilizar un serializador personalizado con un MemberSerializer anidado para acceder al objeto User y recuperar solo el atributo id. Aquí le mostramos cómo puede modificar su código:

    class MemberSerializer(serializers.ModelSerializer):
        class Meta:
            model = Member
            fields = ('id',)
    
    class PostSerializer(serializers.ModelSerializer):
        members = serializers.SerializerMethodField()
    
        def get_members(self, obj):
            return MemberSerializer(obj.file.folder.workspace.members.all(), many=True).data
    
        class Meta:
            model = Post
            fields = ('id', 'file', 'members')
    

    En el PostSerializer, agregamos un campo members que es un SerializerMethodField. Este campo llama al método get_members() para llenar su valor. En el método get_members(), usamos un MemberSerializer para recuperar una lista de objetos Member para el Espacio de trabajo relacionado con el objeto File en la publicación. Luego solo devolvemos la lista de valores id de estos objetos Member.

Comments are closed.