Как объединить в 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"]