Как объединить в Django два или более сериализаторов, которые имеют пользовательские поля, но имеют одну и ту же модель?

Я пытаюсь создать класс сериализатора, который имеет два поля: имя, предмет, но в одном случае мне нужно создать два разных сериализатора для каждого из полей, потому что NameSerializer и SubjectSerializer будут использоваться во многих разных местах. Таким образом, если я использую их, я могу просто получать данные просто через сериализатор и не создавать SerializerMethodField каждый раз. Для моих NameSerializer и SubjectSerializer я использую поле SerializerMethod, я не обращаюсь напрямую к полям. Я могу получить данные напрямую, используя один сериализатор, но я не могу получить данные, когда я использую оба сериализатора в одном объединенном сериализаторе.

models.py

class UserAccount(models.Model):
    name = models.CharField(max_length = 200)
    subject = models.CharField(max_length = 200 )

в файле views.py есть сериализаторы, а также функция views views.py

from rest_framework import serializers
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import UserAccount

class NameSerializer(serializers.ModelSerializer):
    the_name = serializers.SerializerMethodField("getName")
    class Meta : 
        model = UserAccount
        fields = ["the_name"]
    def getName(self,  object):
        return "__"+str(object.name)+"__"

class SubjectSerializer(serializers.ModelSerializer):
    the_subject = serializers.SerializerMethodField("get_the_subject")
    class Meta :
        model = UserAccount
        fields = ["the_subject"]
    def get_the_subject(self , object) : 
        return "__"+str(object.subject)+"__"

class FullSerializer(serializers.ModelSerializer):
    some_name = NameSerializer()
    some_subject = SubjectSerializer()

    class Meta : 
        model = UserAccount
        fields = ["some_name" , "some_subject"]

@api_view(["GET"])
def theView(request , *args , **kwargs):
    userone = UserAccount.objects.get(id = 1)
    data = FullSerializer(userone).data
    return Response(
        data 
    )

Есть ли способ получить данные одной и той же модели, используя два разных сериализатора одной модели. Или я делаю что-то не так. Два сериализатора по отдельности работают хорошо.

Вы можете расширять и повторно использовать сериализаторы посредством наследования. Это позволяет объявить общий набор полей или методов в родительском классе, который затем может быть использован в нескольких сериализаторах.

Также можно декларативно удалить/переопределить Field, унаследованный от родительского класса, установив имя None в подклассе.

Для тебя:

class NameSerializer(serializers.ModelSerializer):
    the_name = serializers.SerializerMethodField("getName")

    ...

    def getName(self,  object):
        return "__"+str(object.name)+"__"


class SubjectSerializer(serializers.ModelSerializer):
    the_subject = serializers.SerializerMethodField("get_the_subject")

    ...

    def get_the_subject(self , object) : 
        return "__"+str(object.subject)+"__"


                          ⬇️             ⬇️
class FullSerializer(NameSerializer, SubjectSerializer):
    # To remove parent fields
    the_name = None
    the_subject = None
    # Than you can define your fields
    some_name = serializers.SerializerMethodField("getName")
    some_subject = serializers.SerializerMethodField("get_the_subject")

    class Meta : 
        model = UserAccount
        fields = ["some_name" , "some_subject"]

Вернуться на верх