Cómo cambiar Django Resumen Grupo de usuarios a String

Hice algunos grupos dentro de Django Admin, pero cada vez que agrego un usuario a uno de esos grupos, sólo el grupo ID muestra dentro de mi API endpoint. ¿Hay alguna manera de mostrar el nombre de la cadena?

Adding Myself to Directors

It Shows up as 1 in the endpoint

Así que en lugar de 1, quiero que el campo sea "Directores". ¿Tiene algo que ver con ampliar el modelo AbstractUser?

Esto es todo lo que tengo ahora mismo, para mi información de usuario:

class User(AbstractUser):
   

Serializer.py

from .models import User
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        exclude = ["username", "password"]
        model = User

Pregunta hecha hace 3 años, 5 meses, 1 días - Por techinnovator


3 Respuestas:

  • Usted puede hacer uso de un SlugRelatedField [drf-doc] para serializar los grupos:

    from .models import User
    
    class UserSerializer(serializers.ModelSerializer):
        # serialize groups with "slugs" ↓
        groups = serializers.SlugRelatedField(
            many=True,
            slug_field='name'
         )
    
        class Meta:
            exclude = ['username', 'password']
            model = User

    Respondida el Dec 16, 2020 a las 20:07 - por compilerchieftain

    Votos positivos: 0 | Votos negativos: 0

  • Parece que estás interesado en mostrar el nombre del grupo de usuarios en lugar de su ID en tu API. Para lograr esto, puedes modificar tu UserSerializer para incluir el nombre del grupo en lugar del ID. Aquí tienes un ejemplo de cómo hacerlo:

    python
    from rest_framework import serializers
    from django.contrib.auth.models import Group
    from .models import User
    
    class UserSerializer(serializers.ModelSerializer):
        groups = serializers.SerializerMethodField()
    
        def get_groups(self, user):
            return [group.name for group in user.groups.all()]
    
        class Meta:
            exclude = ["username", "password"]
            model = User
    

    En este ejemplo, hemos agregado un campo groups utilizando SerializerMethodField que llamará a la función get_groups para obtener los nombres de los grupos a los que pertenece el usuario en lugar de sus IDs.

    Recuerda importar Group en tus imports y asegurarte de que los grupos estén asociados correctamente a los usuarios en tu base de datos.

    Espero que esta solución te ayude a mostrar el nombre del grupo en tu API en lugar del ID.

    Respondida el Dec 17, 2020 a las 20:04 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para mostrar el nombre de cadena del grupo en lugar del ID del grupo en tu API endpoint, debes personalizar el serializador de Django para el modelo User. Aquí tienes cómo hacerlo paso a paso:

    1. Crea un método de serializador personalizado:

    Agrega el siguiente método a tu archivo de serializadores (serializer.py):

    python
    def get_group_name(self, obj):
        return obj.groups.first().name
    

    Este método extrae el primer grupo del usuario y devuelve su nombre.

    2. Actualiza el serializador UserSerializer:

    Agrega el método personalizado get_group_name al campo groups de tu serializador UserSerializer:

    python
    class UserSerializer(serializers.ModelSerializer):
        groups = serializers.SerializerMethodField(method_name="get_group_name")
        class Meta:
            exclude = ["username", "password"]
            model = User
    

    3. Migra tu base de datos:

    Ejecuta el comando makemigrations y luego migrate para crear la columna groups en tu base de datos:

    
    $ python manage.py makemigrations
    $ python manage.py migrate
    

    4. Reinicia tu servidor:

    Reinicia el servidor de Django para que los cambios surtan efecto.

    Ahora, cuando llames al endpoint de tu API, deberías ver el nombre del grupo como una cadena en el campo groups del objeto de usuario serializado.

    Respondida el Dec 17, 2020 a las 20:13 - por Gemini

    Votos positivos: 0 | Votos negativos: 0