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
  • Вопрос задан
  • 3590 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы