DRF: permite todos los campos en la solicitud GET pero restringe POST a un solo campo
Vamos a entenderlo con el ejemplo.
Digamos, quiero crear la API FileUploader, donde almacenará campos como id, file_path, file_name, size, owner, etc. en la base de datos. Vea el modelo de muestra a continuación:
class FileUploader(models.Model):
file = models.FileField()
name = models.CharField(max_length=100) #name is filename without extension
version = models.IntegerField(default=0)
upload_date = models.DateTimeField(auto_now=True, db_index=True)
owner = models.ForeignKey('auth.User', related_name='uploaded_files')
size = models.IntegerField(default=0)
Ahora, para las API esto es lo que quiero:
GET: cuando disparo el punto final GET, quiero todos los campos anteriores para cada archivo cargado.
POST: Pero para que el usuario cree / cargue un archivo, ¿por qué tiene que preocuparse por pasar todos estos campos? Simplemente puede cargar el archivo y luego, supongo, el serializador puede obtener el resto de los campos del ARCHIVO cargado.
Searilizer: Pregunta: Creé a continuación el serializador para cumplir mi propósito. Pero no estoy seguro si es la forma correcta de implementarlo.
class FileUploaderSerializer(serializers.ModelSerializer):
#overwrite = serializers.BooleanField()
class Meta:
model = FileUploader
fields = ('file','name','version','upload_date', 'size')
read_only_fields = ('name','version','owner','upload_date', 'size')
def create(self, validated_data):
return FileUploader.objects.create(**validated_data)
Vista para referencia:
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes = (MultiPartParser, FormParser,)
# overriding default query set
queryset = LayerFile.objects.all()
def get_queryset(self, *args, **kwargs):
qs = super(FileUploaderViewSet, self).get_queryset(*args, **kwargs)
qs = qs.filter(owner=self.request.user)
return qs
También,otra pregunta es que quiero que el usuario proporcione un parámetro adicional llamado 'sobrescribir' (si el archivo ya existe en el servidor).
No estoy seguro de cómo acceder a eso en el serializador.