我有一個模型集視圖,其中根據需求定義了不同的海關功能。我必須撰寫另一個 get 函式,我想在其中使用相同的序列化程式類。但是我在 pkfield 的序列化器類中定義的欄位但是對于 get 函式,我希望它作為字串欄位而不是 pk 欄位。怎么實作??
另外,我定義了 depth=1,這也不起作用。
class Class(TimeStampAbstractModel):
teacher = models.ForeignKey(
Teacher,
on_delete=models.CASCADE,
null=True,
related_name="online_class",
)
subject = models.ForeignKey(
Subject,
on_delete=models.SET_NULL,
null= True,
related_name= "online_class",
)
students_in_class = models.ManyToManyField(Student, related_name="online_class")
我的看法:
class ClassView(viewsets.ModelViewSet):
queryset = Class.objects.all()
serializer_class = ClassSerializer
serializer_action_classes = {
'add_remove_students': AddStudentstoClassSerializer,
'get_all_students_of_a_class': AddStudentstoClassSerializer,
}
def get_serializer_class(self):
"""
returns a serializer class based on the action
that has been defined.
"""
try:
return self.serializer_action_classes[self.action]
except (KeyError, AttributeError):
return super(ClassView, self).get_serializer_class()
def add_remove_students(self, request, *args, **kwargs):
"""
serializer class used is AddStudentstoClassSerializer
"""
def get_all_students_of_a_class(self,request,pk=None):
"""
for this I function too, I want to use the same AddStudentstoClassSerializer class but
there is a problem. The field students_in_class is already defined as pkfield, whereas I
want to use it as a stringfields in the response of this function
""""
我的序列化器:
class AddStudentstoClassSerializer(serializers.ModelSerializer):
students_in_class = serializers.PrimaryKeyRelatedField(
many=True, queryset=Student.objects.all()
)
class Meta:
model = Class
fields = ["students_in_class"]
depth = 1
def update(self, instance, validated_data):
slug = self.context["slug"]
stu = validated_data.pop("students_in_class")
/................other codes....../
return instance
在這里我們可以看到 student_in_class 被定義為 pkfield 這在使用更新 api 時是可以的,但是當我想使用 get api 并呼叫時,get_all_students_of_a_class我希望該欄位是 stringfield 或其他一些欄位。怎么做?同時depth= 1也不能正常作業。
uj5u.com熱心網友回復:
你可以to_representation像這樣覆寫你的方法。
class AddStudentstoClassSerializer(serializers.ModelSerializer):
students_in_class = serializers.PrimaryKeyRelatedField(
many=True, queryset=Student.objects.all()
)
class Meta:
model = Class
fields = ["students_in_class"]
def to_representation(self, instance):
data = {
"students_in_class": # Write your logic here
}
return data
def update(self, instance, validated_data):
slug = self.context["slug"]
stu = validated_data.pop("students_in_class")
/................other codes....../
return instance
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/339890.html
標籤:姜戈 接口 Django 休息框架 首要的关键 django 序列化器
