DRF: permita todos os campos na solicitação GET, mas restrinja o POST a apenas um campo
Vamos entender isso por exemplo.
Digamos, eu quero criar a API FileUploader, onde armazenará campos como id, caminho_do_arquivo, nome_do_arquivo, tamanho, proprietário etc. no banco de dados. Veja o modelo de amostra abaixo:
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)
Agora, para APIs, é isso que eu quero:
GET: Quando eu aciono o terminal GET, desejo todos os campos acima para cada arquivo carregado.
POST: Mas para o usuário criar / fazer upload de arquivo, por que ela precisa se preocupar em passar todos esses campos. Ela pode simplesmente carregar o arquivo e, suponho, o serializador pode obter o restante dos campos do FILE carregado.
Searilizer: Pergunta, questão: Criei abaixo o serializador para servir ao meu propósito. Mas não tenho certeza se é o caminho certo para implementá-lo.
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)
Viewset para referência:
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
Além disso,outra pergunta é que eu quero que o usuário forneça um parâmetro extra chamado 'substituir' (se o arquivo já existir no servidor).
Não sei como acessá-lo no serializador.