Проблемы с получением списка связанных объектов в Serilazier

У меня есть две модели, такие как:

class Car(models.Model):
    name = models.CharField(max_length=255)

class CarImage(models.Model):
    car = models.ForeignKey(Car, related_name='photos')
    photo = models.ImageField(upload_to='car/')

Из приведенных выше моделей я хотел получить все изображения автомобиля. Итак, я пишу свой serailzer следующим образом:

class CarSerializer(serializers.ModelSerializer):
    """
    """
    _id = serializers.ReadOnlyField(source='pk')

    photos = serializers.RelatedField(many=True, read_only=True)

    class Meta:
        model = Car
        fields = ('my_field_here', )

class CarImageSerializer(serializers.ModelSerializer):
    """

    """
    _id = serializers.ReadOnlyField(source='pk')

    class Meta:
        model = CarImage
        fields = ('my_field_here', )

Но в поле фотографий сериализатора CarSerializer выдается эта ошибка RelatedField.to_representation() must be implemented for field . If you do not need to support write operations you probably want to subclassReadOnlyFieldinstead. Но если я использую PrimaryKeyRelatedField вместо RelatedField, тогда он работает нормально, и я получаю список первичного ключа, но мне нужны все поля.

Я также пытался использовать CarImageSerializer как

В Carserializer декалированном

assets_keys = serializers.SerializerMethodField()
def get_assets_keys(self, obj):
    return AssetKeySerializer(obj.asset_keys.all(), context=self.context).data

Но он не может сериализовать список ключей активов, ему нужен один объект.

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

Мой ответ должен выглядеть так:

[
  {
    "_id": 1,
    "name": "first",
    "photos": [
      "name":"xyz",
      "photo":"path_to_photo"
    ]
  },
   {
    "_id": 1,
    "name": "second",
    "photos": [
      "name":"abcddd",
      "photo":"path_to_photo"
    ]
  },
]

person user5594493    schedule 05.04.2016    source источник


Ответы (1)


Вам нужно использовать вложенный сериализатор в CarSerializer:

photos = CarImageSerializer(many=True, read_only=True)
person AKS    schedule 05.04.2016
comment
Да, я понял это через некоторое время, изначально я не использовал Many=True, просто еще один вопрос, я тоже могу использовать один и тот же сериализатор для POST и PUT, верно? - person user5594493; 05.04.2016
comment
По умолчанию вложенные сериализаторы доступны только для чтения. Более подробно вы можете посмотреть мой другой ответ здесь. - person AKS; 05.04.2016