DrMartiner
@DrMartiner
Full-Stack WEB Developer on Django & AngualrJS

Как наследовать serializer в Django REST Framework?

Всем привет

Хочу сделать наследование сериалайзеров в Django REST Framework, но как в документации не работает :-(
Подскажите: в чем причина?

models.py:
class Product(models.Model):
    name = models.CharField(max_length=256)
    price = models.PositiveIntegerField()
    image = models.ImageField(upload_to='products_images')

class ProductFile(BaseFileModel):
    product = models.ForeignKey(Product)
    file = models.FileField(upload_to='products_files')


serializers.py
class ProductFileSerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductFile
        fields = ('file', )

class ProductSerializer(serializers.ModelSerializer):
    files = ProductFileSerializer(read_only=True)

    class Meta:
        model = Product
        fields = ('name', 'price', 'image', 'files')

    def create(self, validated_data):
        t = self._context['request'].data
        slug = Product.get_slug_by_name(validated_data['name'])
        product = Product.objects.create(slug=slug, **validated_data)
        
       # ВОТ ЭТО ДОЛЖНО РАБОТАТЬ, но в validated_data нет files :-(
        # files_data = validated_data.pop('files')
        # for data in files_data:
        #     ProductFile.objects.create(product=product, **data)

        return product
  • Вопрос задан
  • 3709 просмотров
Пригласить эксперта
Ответы на вопрос 2
@marazmiki
Укротитель питонов
# ВОТ ЭТО ДОЛЖНО РАБОТАТЬ, но в validated_data нет files :-(


Не должно. Обратите внимание на аргумент read_only=True у поля files. Попробуйте угадать, что оно означает, только чур — не подглядывайте в документацию.
Ответ написан
DrMartiner
@DrMartiner Автор вопроса
Full-Stack WEB Developer on Django & AngualrJS
Поля files нет в модели, и атрибут read_only=True как бы намекает нам, что не следует искать его у модели. Если его удалить, то будет валиться с такой ошибкой:

Got AttributeError when attempting to get a value for field `files` on serializer `ProductSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Product` instance.
Original exception text was: 'Product' object has no attribute 'files'.


Если удалить 'files' из кортежа fields, то будет вот так:

The field 'files' was declared on serializer ProductSerializer, but has not been included in the 'fields' option.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы