как переопределить возвращенный объект сериализатора, который возвращается с ответом django rest framework serializer - PullRequest
0 голосов
/ 11 июля 2019

У меня есть проект Django Rest Framework.Я хочу переопределить возвращенную структуру объекта json, когда делается запрос get для отображения определенного способа, не похожего на структуру базы данных.

Мой текущий возвращаемый объект отображается так:

    {
        "id": 9,
        "namespace": "steve",
        "path": "something/another",
        "value": "this is a value",
        "person": 1
    },
    {
        "id": 11,
        "namespace": "namespace1",
        "path": "path2",
        "value": "anyoher value",
        "person": 2
    },
    {
        "id": 12,
        "namespace": "namespace1",
        "path": "path3",
        "value": "this dsiaalks",
        "person": 2
    },
    {
        "id": 13,
        "namespace": "namespace2",
        "path": "path4",
        "value": "asdfasdfasdf",
        "person": 2
    },

Я хочу переключить

"person":2 

на отображение

"user":{
    "userId":testUser
}
  • testUser - это имя пользователя с идентификатором 2 *

Это мой текущий serailzer:

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', 'person')

, и это текущая модель:

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'

поле person является внешним ключом для пользователя.

Ответы [ 2 ]

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

Надеюсь, это поможет:

serializers.py

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', 'person')

    def to_representation(self, instance):
        ret = super(PreferenceSerializer, self).to_representation(instance)
        # check the request is list view or detail view
        is_list_view = isinstance(self.instance, list)
        if is_list_view:
            person_id = ret.pop('person', None)
            user_obj = User.objects.filter(id=person_id).first()
            user_name = user_obj.username if user_obj else ""
            extra_ret = {
                "user": {
                    "userId": user_name
                }
            }
            ret.update(extra_ret)
        return ret
0 голосов
/ 11 июля 2019

Я думаю, вы можете использовать метод моделей.Например:

models.py

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

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

    class Meta:
        db_table = 'preference'

, затем в сериализаторе:

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', 'person', 'get_person')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...