#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 Можете ли вы предоставить представление?