Saya memecahkan masalah ini dengan ModelViewSet dan ModelSerializer. Semoga ini bisa membantu masyarakat.
Saya juga lebih suka memiliki validasi dan Object-> JSON (dan sebaliknya) login di serializer itu sendiri daripada di views.
Mari kita pahami dengan contoh.
Katakanlah, saya ingin membuat API FileUploader. Dimana akan menyimpan field seperti id, file_path, file_name, size, owner dll dalam database. Lihat contoh model di bawah ini:
class FileUploader(models.Model):
file = models.FileField()
name = models.CharField(max_length=100)
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)
Sekarang, Untuk API inilah yang saya inginkan:
- DAPATKAN:
Ketika saya mengaktifkan titik akhir GET, saya ingin semua bidang di atas untuk setiap file yang diunggah.
- POS:
Tetapi bagi pengguna untuk membuat / mengunggah file, mengapa dia harus khawatir tentang melewati semua bidang ini. Dia bisa mengunggah file dan kemudian, saya kira, serializer bisa mendapatkan sisa bidang dari FILE yang diunggah.
Searilizer:
Pertanyaan: Saya membuat serializer di bawah ini untuk memenuhi tujuan saya. Tetapi tidak yakin apakah itu cara yang tepat untuk menerapkannya.
class FileUploaderSerializer(serializers.ModelSerializer):
class Meta:
model = FileUploader
fields = ('file','name','version','upload_date', 'size')
read_only_fields = ('name','version','owner','upload_date', 'size')
def validate(self, validated_data):
validated_data['owner'] = self.context['request'].user
validated_data['name'] = os.path.splitext(validated_data['file'].name)[0]
validated_data['size'] = validated_data['file'].size
return validated_data
def create(self, validated_data):
return FileUploader.objects.create(**validated_data)
Viewset untuk referensi:
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes = (MultiPartParser, FormParser,)
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