我正在创建一个基于 Django 的 Web 应用程序,其中
Post
模型将具有多个图像和视频。我想上传图像模型中的多个图像和视频模型中的视频
# models.py
#Post Model
class Post(models.Model):
# Owner / user
user = models.ForeignKey(to=User, on_delete=models.CASCADE)
caption = models.CharField(max_length=64, verbose_name='Post Caption')
body = models.CharField(max_length=1024, verbose_name='Post Body')
def __str__(self):
return self.user.email
def get_author(self):
return self.user.email
class Image(models.Model):
post = models.OneToOneField(to=Post, on_delete=models.CASCADE)
image = models.ImageField()
class Video(models.Model):
post = models.OneToOneField(to=Post, on_delete=models.CASCADE)
image = models.FileField()
# serializers.py
class PropertySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Property
fields = '__all__'
def create(self, validated_data):
media_files = self.context.get('view').request.FILES
post = Property.objects.create(
**validated_data
)
for file in media_files.values():
"""
if file is video:
then file will be saved in video model
if file is image:
then file will be saved in image model
How to do it?
"""
以及如何验证文件是否只是图像或视频。如果有人发布除图像或视频之外的任何其他内容,则会出现验证错误。有什么好的办法吗?
我已经想通了
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Post_Images
fields = (
'post',
'image',
'image_name'
)
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = Post_Video
fields = (
'post',
'video',
'video_name'
)
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = (
'id','user','caption','body'
)
views.py
class MediaCreateView(APIView):
parser_classes = (MultiPartParser, FormParser)
authentication_classes = [TokenAuthentication]
permission_classes = [IsAgentOrIsOwner]
serializer_class = None
media = None
def modify_input_for_multiple_files(self, post_id, file, name):
obj = {'post': post_id,
f"{self.media}": file,
f"{self.media}_name": name,
}
return obj
# post method
def post(self, request, pk):
# converts query dict to original dict
media = dict(request.data.lists())[self.media]
names = dict(request.data.lists())[f"{self.media}_name"]
media_name_list = list(zip(media, names))
print(media_name_list)
flag = 1
arr = []
for element in media_name_list:
modified_data = self.modify_input_for_multiple_files(pk,
element[0],
element[1])
file_serializer = self.serializer_class(data=modified_data)
if file_serializer.is_valid():
file_serializer.save()
arr.append(file_serializer.data)
else:
flag = 0
if flag == 1:
return Response(arr, status=status.HTTP_201_CREATED)
else:
return Response(arr, status=status.HTTP_400_BAD_REQUEST)
def get(self, request, pk):
images = Property_Images.objects.filter(property=pk)
serializer = self.serializer_class(images, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class ImageView(MediaCreateView):
serializer_class = ImageSerializer
media = 'image'
queryset = Property_Images.objects.all()
queryobject = Property_Images.objects
class VideoView(MediaCreateView):
serializer_class = VideoSerializer
media = 'video'
queryset = Property_Video.objects.all()
queryobject = Property_Video.objects
强调文字ههفههههففففففففففففففففففففف