django получает размер файла и помещает его в сериализатор

#django

Вопрос:

serializers.py

 class ModFileSerializer(serializers.ModelSerializer):
    size = serializers.CharField(default=os.path.getsize('file'), max_length=16)
    class Meta:
        model = models.ModFile
        fields = '__all__'

        read_only_fields = (
        'size',
        )
 

models.py

 class ModFile(models.Model):
    downloads = models.IntegerField(default=0)
    file = models.FileField(upload_to='mods/')
    created_at = models.DateTimeField(auto_now_add=True)
 

Здесь у меня есть сериализатор для модели ModFile, и единственное, чего не хватает, — это размер файла, я знаю, что os.path.getsize() нуждается в точном местоположении файла, так как мне получить доступ к полю файла из модели, чтобы передать функцию getsize (), или есть лучший способ сделать это?

Ответ №1:

 class ModFileSerializer(serializers.ModelSerializer):
    size = serializers.SerializerMethodField()

    def get_size(self, obj):
        return os.path.getsize(obj.file.path)
        
    class Meta:
        model = models.ModFile
        fields = '__all__'

        read_only_fields = (
            'size',
        )
 

Я думаю, что это сработает в любое время, когда вы используете этот сериализатор.

obj в методе get_size находится сам экземпляр.

Ответ №2:

Добавьте to_representation метод в свой сериализатор, что очень просто.

 class ModFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ModFile
        fields = '__all__'

    def to_representation(self, instance):
        rep = super(ModFileSerializer, self).to_representation(instance)
        rep['size'] = instance.file.size
        return rep
 

Комментарии:

1. @Lun Вы уверены, что написали это правильно? Вы не добавили to_representation в Meta классе, не так ли?

2. Я так и сделал, может быть, проблема в том, как я справляюсь с вещами в apiview, спасибо за помощь!

3. @Lun Можете ли вы предоставить представление?