OneToOne相关模型的纯结构(Django Rest框架)

问题描述 投票:0回答:2

型号:

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveSmallIntegerField()
    # More Person fields


class Student(models.Model):
    person = models.OneToOneField(
        Person, on_delete=models.PROTECT, primary_key=True)
    year_of_study = models.PositiveSmallIntegerField()
    # More Student fields

序列化器:

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = '__all__'


class StudentSerializer(serializers.ModelSerializer):
    person = PersonSerializer()
    class Meta:
        model = Student
        fields = '__all__'

视图:

class StudentView(viewsets.ReadOnlyModelViewSet):
    renderer_classes = [JSONRenderer]
    parser_classes = [JSONParser]

    queryset = Student.objects.all()
    serializer_class = StudentSerializer

请求单个学生:

{
  "person": {
    "id": 1,
    "name": "Example Name",
    "age": 20
  },
  "year_of_study": 3
}

但是我需要使用简单的结构,例如:

{
  "id": 1,
  "name": "Example Name",
  "age": 20,
  "year_of_study": 3
}
  1. 在哪里(在序列化程序中还是在视图中或其他地方),我应该怎么做?
  2. 我只需要GET请求(因此使用ReadOnlyModelViewSet)。但是,如果也很高兴知道如何创建/更新/删除这种结构。
django django-rest-framework
2个回答
1
投票

您可以创建如下的序列化器

class StudentSerializer(serializers.ModelSerializer):
   name = serilizer.CharFiled(source="person.name")
   person_id = serilizer.IntegerFiled(source="person.id") 
   age = serilizer.IntegerFiled(source="person.age")
   class Meta:
        model = Student
        exclude = ('person',)


0
投票

您具有person = PersonSerializer(),用于输出此人的数据。删除此行,它将仅显示person_id

现在,如果要使用返回的个人数据的GET和使用person_id的POST的组合,可以执行以下操作:

person = PersonSerializer(read_only=True)
person_id = serializers.PrimaryKeyRelatedField(
    queryset=Person.objects.all(),
    source='person',
    write_only=True,
)
© www.soinside.com 2019 - 2024. All rights reserved.