ฉันแก้ปัญหานี้ด้วย ModelViewSet และ ModelSerializer หวังว่านี่จะช่วยชุมชนได้
ฉันยังคาดหวังที่จะมีการตรวจสอบความถูกต้องและการเข้าสู่ระบบ Object-> JSON (และในทางกลับกัน) ใน serializer มากกว่าในมุมมอง
มาทำความเข้าใจกับตัวอย่าง
พูดว่าฉันต้องการสร้าง FileUploader API โดยจะจัดเก็บฟิลด์เช่น id, file_path, file_name, size, owner และอื่น ๆ ในฐานข้อมูล ดูโมเดลตัวอย่างด้านล่าง:
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)
ตอนนี้สำหรับ API นี่คือสิ่งที่ฉันต้องการ:
- รับ:
 
เมื่อฉันเริ่มต้น GET endpoint ฉันต้องการช่องด้านบนสำหรับทุกไฟล์ที่อัปโหลด
- โพสต์:
 
แต่สำหรับผู้ใช้ในการสร้าง / อัปโหลดไฟล์ทำไมเธอต้องกังวลเกี่ยวกับการส่งผ่านฟิลด์เหล่านี้ทั้งหมด เธอสามารถอัปโหลดไฟล์จากนั้นฉันคิดว่า serializer สามารถรับฟิลด์ที่เหลือจาก FILE ที่อัปโหลดได้
Searilizer: 
คำถาม:ฉันสร้าง serializer ด้านล่างเพื่อตอบสนองวัตถุประสงค์ของฉัน แต่ไม่แน่ใจว่าเป็นวิธีที่ถูกต้องหรือไม่
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 สำหรับการอ้างอิง:
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