我在下面有這個 POST 端點,可以創建一個帖子。創建帖子時,請求可以附帶視頻和影像。正如您在下面看到的,序列化程式處理影像和視頻之外的發布資料,因為我需要對影像和視頻進行驗證。回應回傳序列化的資料,但只回傳與影像和視頻無關的所有內容。我希望回應也回傳影像和視頻 url、uuid 等內容。我怎樣才能用新創建的來做到這一點post_obj?
查看.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)
序列化程式.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('creator', 'body', 'uuid', 'created', 'updated_at')
模型.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
我在這里有一個功能
助手檔案
def full_post_data_serializer(post_query_set: QuerySet):
"""
Returns post information in news feed form to include:
creator username, goal description, reply count, cheer count, photos
and video
Parameters:
post_query_set: Current Post model object query set
Returns:
serializer containing all data in query set serialized
for news feed
"""
query_set_annotated = post_query_set.annotate(
creator_username=F('creator__username'),
goal_description=F('join_goal__goal__description'),
goal_uuid=F('join_goal__goal__uuid'),
reply_count=Count('replypost', distinct=True),
cheer_count=Count('cheerpost', distinct=True)
).prefetch_related(
Prefetch('photo_set', Photo.objects.order_by('-created'))
)
return FullPostDataSerializer(query_set_annotated, many=True)
序列化程式.py
class FullPostDataSerializer(serializers.ModelSerializer):
image_url = serializers.SlugRelatedField(
source='photo_set', many=True, read_only=True, slug_field='image_url'
)
image_uuid = serializers.SlugRelatedField(
source='photo_set', many=True, read_only=True, slug_field='uuid'
)
video_url = serializers.SlugRelatedField(
source='video_set', many=True, read_only=True, slug_field='video_url'
)
video_uuid = serializers.SlugRelatedField(
source='video_set', many=True, read_only=True, slug_field='uuid'
)
goal_uuid = serializers.SlugField()
creator_username = serializers.SlugField()
reply_count = serializers.IntegerField()
cheer_count = serializers.IntegerField()
goal_description = serializers.SlugField()
class Meta:
model = Post
fields = (
'body', 'join_goal', 'created', 'creator_username', 'goal_description', 'reply_count', 'cheer_count',
'image_url', 'uuid', 'type', 'image_uuid', 'creator', 'video_url', 'video_uuid', 'goal_uuid'
)
如果我可以將其應用于具有我需要的一切的 Django 模型物件。這僅適用于查詢集。
uj5u.com熱心網友回復:
為此,您可以使用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
讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322283.html
