python - Django REST 序列化程序,如何添加额外的字段并设置它
问题描述
我需要你的帮助,扩展课程超出了我目前的 Python 技能。
Django 3.1 和 Django-Rest-Framework。
我想将“detail_url”字段添加到 VideoSerializer,并根据模型上的现有字段设置其值。“detail_url”未在模型中定义,我想在调用视图时动态生成它。我认为,序列化程序是最好的地方。
谢谢
序列化程序.py
from rest_framework import serializers
from django.urls import reverse
from main.models import Video
class VideoSerializer(serializers.ModelSerializer):
detail_url = serializers.URLField()
class Meta:
model = Video
fields = ['uuid', 'url', 'title', 'thumbnail_url', 'detail_url']
# fields = '__all__'
detail_url = reverse('video_detail', args=[model.uuid]) # <- this is the part I dont know where to declare
视图.py
def dashboard(request):
context = {}
if request.method == 'GET':
user = request.user
# retrieve user's videos
videos = Video.objects.filter(user=user)
if videos.exists():
serializer = VideoSerializer(videos, many=True)
context['videos'] = json.dumps(serializer.data)
return render(request, 'main/dashboard.html', context)
解决方案
serializermethodfield
当你想添加一个作为方法结果的字段时,你应该使用
class VideoSerializer(serializers.ModelSerializer):
...
detail_url = serializers.SerializerMethodField()
def get_detail_url(self, obj):
return reverse('video_detail', obj.uuid)
推荐阅读
- mongodb - 聚合上的未闭合括号
- javascript - 如何在图表js的Y轴上应用美元符号?
- angular - 在项目中使用 ng6-toastr 后,请在规范文件 jasmine 中使用 setRootViewContainerRef 设置根 ViewContainerRef
- javascript - 专注于模糊上新创建的输入字段
- javascript - 事件监听器没有触发?
- c++ - 无法使用 soci 库连接到 SQL Server
- c# - 检测无 BOM 或有 BOM 的 utf-8
- javascript - 避免在ajax中等待其他进程完成
- json - 如果对象的所有字段都为空,如何将对象设置为空?
- python - 如何在 Google Colab 中安装 CUDA - 没有 ATen_cuda 库无法初始化 CUDA