আমি মডেলভিউসেট এবং মডেলশিরাইজার দিয়ে এই সমস্যার সমাধান করেছি। আশা করি এটি সম্প্রদায়কে সহায়তা করবে।
আমি ভেরিফিকেশন এবং অবজেক্ট-> জেএসওএন (এবং তদ্বিপরীত) ভিউয়ের পরিবর্তে সিরিয়ালে নিজেই লগইন করতে পছন্দ করি।
উদাহরণস্বরূপ এটি বুঝতে দেয়।
বলুন, আমি ফাইলআপলোডার এপিআই তৈরি করতে চাই। যেখানে এটি ডাটাবেসে আইডি, ফাইল_পথ, ফাইল_নাম, আকার, মালিক ইত্যাদির মতো ক্ষেত্রগুলি সংরক্ষণ করবে। নীচে নমুনা মডেল দেখুন:
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)
এখন, এপিআইগুলির জন্য এটি আমি যা চাই:
- পাওয়া:
আমি যখন জিইটি শেষ পয়েন্টটি ফায়ার করি, আমি প্রতিটি আপলোড করা ফাইলের জন্য উপরের ক্ষেত্রগুলি চাই।
- পোস্ট:
তবে ব্যবহারকারী ফাইল তৈরি / আপলোড করার জন্য কেন তাকে এই সমস্ত ক্ষেত্রটি পাস করার বিষয়ে চিন্তা করতে হবে। তিনি কেবল ফাইলটি আপলোড করতে পারেন এবং তারপরে আমার ধারণা, সিরিয়ালাইজার আপলোড করা ফাইল থেকে বাকী ক্ষেত্রগুলি পেতে পারে।
সিলিলাইজার:
প্রশ্ন: আমি আমার উদ্দেশ্যটি পরিবেশন করতে নীচে সিরিয়াল তৈরি করেছি। তবে এটি কার্যকর করার সঠিক উপায় কিনা তা নিশ্চিত নন।
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)
রেফারেন্সের জন্য ভিউসেট:
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