Let's understand it by example.
Say, I want to create FileUploader API, where it will be storing fields like id, file_path, file_name, size, owner, etc in database. See sample model below:
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)
Now, For APIs this is what I want:
GET: When I fire the GET endpoint, I want all above fields for every uploaded file.
POST: But for user to create/upload file, why she has to worry about passing all these fields. She can just upload the file and then, I suppose, serializer can get rest of the fields from uploaded FILE.
Searilizer: Question: I created below serializer to serve my purpose. But not sure if its the right way to implement it.
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 for reference:
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
Also, another question is I want user to provide extra parameter called 'overwrite' (if file already exist on server).
I am not sure how to access that in serializer.
IMHO, multiple serializers are only going to create more and more confusion.
@AaronLelevier - I looked into other stackoverflow solution as you suggested. But finally decided to implement my own clean solution.
I would prefer below solution:
I think this is the cleanest approach.
Sample code: (modified serializer.py, views.py remain unchanged)