Как изменить формат отношения многие ко многим в drf - PullRequest
0 голосов
/ 27 января 2020

Это мой сериализатор класса

class ProjectSerializer(ModelSerializer):
    created_by = SlugRelatedField(read_only=True, slug_field='email')
    updated_by = SlugRelatedField(read_only=True, slug_field='email')
    team = SlugRelatedField(many=True, read_only=True, slug_field='first_name')
    class Meta:
       model = Project
       exclude = ['deleted_at']

Это Models.py

class Project(MandatoryFields, Model):  
    project_name = models.CharField(max_length=255, blank=True)
    project_areas = models.CharField(max_length=255, blank=True)
    team = models.ManyToManyField(
        settings.AUTH_USER_MODEL, blank=True, related_name="%(app_label)s_%(class)s_team")
    project_manager = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True,
        related_name="%(app_label)s_%(class)s_project_manager")       
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)

    REQUIRED_FIELDS = []

    def __str__(self):
        return self.project_name

Я получаю такой ответ

"status": true,
    "data": [
        {
            "id": 1,
            "created_by": "abc@google.com",
            "updated_by": "abc@google.com",
            "project_manager": "abc@google.com",
            "team": ["Rahul",
             "Anoop",
             ],
            "created_date": "2020-01-16T05:18:58.471601Z",
            "modified_date": "2020-01-16T05:18:58.471662Z",
            "project_name": "ABC",
            "project_areas": "ABC",
            "start_date": null,
            "end_date": null,
        },

Моя проблема Команда - это отношения многих ко многим с моделью пользователя. Мне нужно изменить ответ полевой команды. Нужно вернуть идентификатор и имя в формате словаря.

Как я могу изменить это

 "team": [
        {
            "id": 1,
            "name": "Rahul",
        },
        {
            "id": 2,
            "name": "Anoop",
        }
    ], 

1 Ответ

4 голосов
/ 27 января 2020

Создайте вложенный сериализатор (TeamSerializer) и подключите его в ProjectSerializer as,

<b>from django.contrib.auth import get_user_model


class TeamSerializer(serializers.ModelSerializer):
    name = serializers.CharField(source='first_name')

    class Meta:
        model = get_user_model()
        fields = ('id', 'name')</b>


class ProjectSerializer(ModelSerializer):
    created_by = SlugRelatedField(read_only=True, slug_field='email')
    updated_by = SlugRelatedField(read_only=True, slug_field='email')
    <b>team = TeamSerializer(many=True, read_only=True)</b>

    class Meta:
        model = Project
        exclude = ['deleted_at']

Я также использовал здесь аргумент source, который использовался для указания источника данных, которые необходимо извлечь.


Update-1

Использование SerializerMethodField

from django.contrib.auth import get_user_model


class TeamSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()

    class Meta:
        model = get_user_model()
        fields = ('id', 'name')

    def get_name(self, user):
        return '{} {}'.format(user.first_name, user.last_name)
...