Django - конечная точка POST для обновления нескольких таблиц. Возвращайте ответ со всеми необходимыми данными
У меня есть конечная точка POST, которая создает пост. Когда создается пост, запрос может сопровождаться видео и изображениями. Как вы можете видеть ниже, сериализатор обрабатывает данные поста вне изображений и видео, потому что мне нужно выполнить валидацию изображений и видео. Ответ возвращает сериализованные данные, но только все, что не относится к изображениям и видео. Я бы хотел, чтобы ответ также возвращал такие данные, как url изображения и видео, uuid. Как я могу сделать это с помощью недавно созданного post_obj
?
view.py
@api_view(['POST'])
def POST_create_post(request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
try:
post_obj = serializer.save()
try:
if 'images' in request.FILES.keys():
for img in request.FILES.getlist('images'):
validate_image_upload(img)
Photo.objects.create(post=post_obj, image=img)
if 'video' in request.FILES.keys():
vid = request.FILES.get('video')
validate_video_upload(vid)
Video.objects.create(post=post_obj, video=vid)
except ValidationError as e:
return Response(dict(error=e,
user_message=error_message_generic),
status=status.HTTP_400_BAD_REQUEST)
except django.db.utils.InternalError as e:
return Response(dict(error=serializer.errors,
user_message=error_message_generic),
status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(dict(error=serializer.errors,
user_message=error_message_generic),
status=status.HTTP_400_BAD_REQUEST)
serializer.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('creator', 'body', 'uuid', 'created', 'updated_at')
models.py
class Photo(AbstractBaseModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField(upload_to=images_directory_path)
@property
def image_url(self):
return self.image.url
class Video(AbstractBaseModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
video = models.FileField(upload_to=videos_directory_path)
@property
def video_url(self):
return self.video.url
Для этого можно использовать SerializerMethodField. которое будет полем только для чтения.
например, в вашем случае:-
class PostSerializer(serializers.ModelSerializer):
image_url = serializers.SerializerMethodField()
class Meta:
model = Post
fields = ('creator', 'body', 'uuid', 'created', 'updated_at' , 'image_url')
def get_image_url(self , obj):
# obj is Post object
# return image_url here
Дайте мне знать, если это сработает для вас.