Настройте возвращаемый объект из сериализатора django rest framework - PullRequest
0 голосов
/ 10 июля 2019

Я хочу настроить возвращаемый объект сериализатора django rest framework в соответствии с конкретными требованиями.прямо сейчас он возвращает поля в одном объекте, который не является вложенным.

{
    "id": 9,
    "namespace": "steve",
    "path": "something/another",
    "value": "this is a value"
},

и вот как я хочу, чтобы результат выглядел следующим образом:

{
    "id": 6,
    "namespace": "tempnamespaced",
    "path": "randompath",
    "value": "anothertest",
    "user": {
        "userId": "testUser1"
    }
}

Поэтому я хочу добавить вложенный объект с именем user и добавить значение userID внутри пользователя.

данные, которые возвращаются в userId, на самом деле являются person.username person - это имя пользователя модели, поэтому данные будут выглядеть так, когда они назначены и возвращены:

"user": {
    "userId": {{person.username}}
}

Iприкрепит код MMY ниже:

сериализатор:

from rest_framework import serializers
from .models import Preference
from django.contrib.auth.models import User


class PreferenceSerializer(serializers.ModelSerializer):
    # person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)

    class Meta:
        model = Preference
        fields = ('id', 'namespace', 'path', 'value')

здесь - набор параметров get:

    @permission_classes((IsAuthenticated))
    def get_queryset(self):
        namespace = self.kwargs.get('namespace', None)
        path = self.kwargs.get('path', None)
        if namespace is None and path is None:
            queryset = Preference.objects.all().filter(user_id=1)
        if namespace and path is None:
            queryset = Preference.objects.all().filter(user_id=1, namespace=namespace)
        if namespace and path:
            queryset = Preference.objects.all().filter(user_id=1, namespace=namespace, path=path)
        return queryset

здесь режим:

from django.db import models
from django.contrib.auth.models import User
from owf_framework.people.models import Person

class Preference(models.Model):
    id = models.BigAutoField(primary_key=True, null=False)
    version = models.BigIntegerField(default=1, null=False)
    path = models.CharField(max_length=200, null=False)
    namespace = models.CharField(max_length=200, null=False)
    value = models.TextField(null=False)
    user_id = models.BigIntegerField(null=False, default=1)
    person = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.namespace

    class Meta:
        db_table = 'preference'

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Определите to_representation() в вашем сериализаторе:

class PreferenceSerializer(serializers.ModelSerializer):
    # person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)

    class Meta:
        model = Preference
        fields = ('id', 'namespace', 'path', 'value')

    def to_representation(self, instance):
        ret = super().to_representation(instance)
        ret['user'] = {'userId': instance.person.username}
        return ret
0 голосов
/ 11 июля 2019

Вы можете добавить метод в вашу модель, чтобы он возвращал имя пользователя вместо имени поля.

class Preference(models.Model):
    id = models.BigAutoField(primary_key=True, null=False)
    version = models.BigIntegerField(default=1, null=False)
    path = models.CharField(max_length=200, null=False)
    namespace = models.CharField(max_length=200, null=False)
    value = models.TextField(null=False)
    user_id = models.BigIntegerField(null=False, default=1)
    person = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.namespace

    def get_username(self):
        return self.person.username

    class Meta:
        db_table = 'preference'

Сериализатор теперь может использовать этот метод.

class PreferenceSerializer(serializers.ModelSerializer):
    person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)

    class Meta:
        model = Preference
        fields = ('id', 'namespace', 'path', 'value', 'person', 'get_username')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...