Фреймворк Django Rest не сохраняет все объекты внешнего ключа

#python-3.x #django #django-models #django-rest-framework

#python-3.x #django #django-модели #django-rest-фреймворк

Вопрос:

Я собираюсь создать конференцию и выбрать несколько отделов, она работает, когда я отправляю post-запрос, но в GET resquest не получаю объекты.

 class DepartmentModel(models.Model):
    name = models.CharField(max_length=255)
    conference = models.ForeignKey('ConferenceModel', on_delete=models.CASCADE, null=True,
                                   related_name='conference_departments')

class ConferenceModel(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    description = models.CharField(max_length=255, null=True)
 

serializers.py

 class DepartmentField(serializers.PrimaryKeyRelatedField):
    def to_representation(self, value):
        pk = super(DepartmentField, self).to_representation(value)
        try:
            item = DepartmentModel.objects.get(pk=pk)
            serializer = DepartmentSerializer(item)
            return serializer.data
        except DepartmentModel.DoesNotExist:
            return None

    def get_choices(self, cutoff=None):
        queryset = self.get_queryset()
        if queryset is None:
            return {}

        return OrderedDict([(item.id, str(item)) for item in queryset])

class ConferenceModelSerializer(serializers.ModelSerializer):
    conference_departments = DepartmentField(queryset=DepartmentModel.objects.all(), many=True)
    meeting_participants = SelectItemField(model='account.User', extra_field=['first_name', 'last_name'], many=True)

    class Meta:
        model = ConferenceModel
        fields = '__all__'
 

запрос

 {
    "conference_departments": [
        3, 4, 5, 7, 8
    ],
    "meeting_participants": [
        10, 12, 15
    ],
    "description": "Bla bla bla"
}
 

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

здесь вы можете видеть на изображении ниже

введите описание изображения здесь

id: 19 — это последний сохраненный объект, он возвращает объекты отдела, а id: 18 — нет!

кто-нибудь может мне помочь, пожалуйста? любая помощь будет оценена! Заранее спасибо!

Ответ №1:

 class DepartmentSerializer(serializers.ModelSerializer):

    ...

    class Meta:
        model = DepartmentModel
        fields = '__all__'

class ConferenceModelSerializer(serializers.ModelSerializer):
    conference_departments = DepartmentSerializer(required=False, many=True)
    meeting_participants = SelectItemField(model='account.User', extra_field=['first_name', 'last_name'], many=True)

    class Meta:
        model = ConferenceModel
        fields = '__all__'

 

Вложенные отношения

Доступные для записи вложенные сериализаторы