Как написать и сделать правильный запрос POST для вложенных сериализаторов в DRF? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть две простые модели и сериализаторы для Course и Department, как показано ниже: (Курс принадлежит отделу, то есть отношение «один к одному» от Course до Department)

# models.py
# Department Model
class Department(models.Model):
  name = models.CharField(max_length=256)
  location = models.CharField(max_length=1024)

# Course Model
class Course(models.Model):
  code = models.CharField(max_length=15, unique=True)
  name = models.CharField(max_length=15, unique=True)
  department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None,
                                   null=True, blank=True)

###################################
# serializers.py
# Department serializer
class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = ['id', 'name']

# Course serializer
class CourseSerializer(serializers.ModelSerializer):
    department = DepartmentSerializer()

    class Meta:
        model = Course
        fields = '__all__'

После добавления некоторых курсов через SQL Запросы я сделал GET запрос к конечной точке localhost:8000/courses/, который дает ожидаемый результат.

[
  {
    "id": 1,
    "code": "SS240",
    "name": "Sociology",
    "department": {
      "id": 1,
      "name": "Humanities"
    }
  },
  {
    "id": 2,
    "code": "CS310",
    "name": "Data Structures and Algorithms",
    "department": {
      "id": 5,
      "name": "Computer Sciences"
    }
  }
]

Я хочу сделать POST запрос до конечной точки localhost:8000/courses/. Скажем, у меня есть отдел с name = Computer Sciences с id = 5 . Я хочу добавить курс с code = CS330, name = объектно-ориентированный дизайн, отдел = компьютерные науки . Как мне написать тело запроса?

Следующее дает ошибку из-за вложенного представления отдела

{
  "code": "CS330",
  "name": "Object Oriented Design",
  "department": 5
}

Должно ли это быть так?

{
  "code": "CS330",
  "name": "Object Oriented Design",
  "department": {
    "id": 5,
    "name": "Computer Sciences"
  }
}

Как переопределить метод .create()?

1 Ответ

1 голос
/ 26 апреля 2020

Переопределите ваш to_representation(...) метод CourseSerializer класс

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = '__all__'

    <b>def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['department'] = DepartmentSerializer(instance.department).data
        return rep</b>

Ссылка:

...