serialization - DRF 发布到字段而不在 API 表单中显示
问题描述
我有一个 Django Rest 框架 API。我希望模型上有一个“结果”字段,但未显示在 API 表单上,但在我列出数据或查看详细信息时仍出现在 json 中。
所以我想在我的 POST 表单上看到这个:
这在我的 GET 请求中:
如何才能做到这一点?
序列化器.py:
从 rest_framework 导入序列化程序
从 .models 导入表达式
类 ExpressionSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
self.operator_mapping = {
"add": " + ",
"minus": " - ",
"divide": " / ",
"multiply": " * "
}
super(ExpressionSerializer, self).__init__(*args, **kwargs)
class Meta:
model = Expression
fields = ["expression", "result"]
def create(self, validated_data):
expression_obj = Expression.objects.create(**validated_data)
return expression_obj
def update(self, instance, validated_data):
instance.expression = validated_data.get('expression', instance.expression)
instance.result = validated_data.get('result', instance.result)
instance.save()
return instance
视图.py:
from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from lxml import etree
from .serialisers import ExpressionSerializer
from .models import Expression
class ExpressionAPIView(APIView):
def __init__(self):
self.operator_mapping = {
"add": " + ",
"minus": " - ",
"divide": " / ",
"multiply": " * "
}
self.queryset = Expression.objects.all()
self.serializer_class = ExpressionSerializer
def get(self, request):
return Response({'data': request.data})
def post(self, request):
root = etree.XML(request.data['expression'])
result = self.evaluate_expression(root)[0]
exp_parsed = self.expression_to_string(root) + f" = {result}"
serializer_data = {'expression': exp_parsed, 'result': result}
serializer = self.serializer_class(
data=serializer_data,
)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.validated_data, status=status.HTTP_201_CREATED)
def expression_to_string(self, root):
expression = ""
for child in root:
if child.tag != "root" and child.tag != "expression":
if child.tag == "number":
num = int(child.text)
if child != root[-1]:
expression += f"{num} {self.operator_mapping[root.tag]} "
else:
expression += f"{num}"
else:
if child != root[-1]:
expression += f"({self.expression_to_string(child)}) {self.operator_mapping[root.tag]} "
else:
expression += f"({self.expression_to_string(child)})"
else:
expression += f"{self.expression_to_string(child)}"
return expression
def evaluate_expression(self, root):
numbers = []
for child in root:
if child.tag == "number":
num = int(child.text)
numbers.append(num)
elif child.tag in ["add", "minus", "divide", "multiply"]:
_ = self.evaluate_expression(child)
def eval_sublist(_, operator):
x = _[0]
for i in range(1, len(_)):
x_str = f"{x}{operator}{_[i]}"
x = eval(x_str)
return x
numbers.append(eval_sublist(_, self.operator_mapping[child.tag]))
else:
numbers.extend(self.evaluate_expression(child))
return numbers
解决方案
您可以将该result
字段定义为read only
在您的序列化程序上。
这可以通过在read_only_fields
类中定义额外的序列化程序参数Meta
或通过显式定义result
字段并向其添加read_only=True
标志来实现。
推荐阅读
- java - android_app\app\src\main\java\ApiServices.java:49: 错误:注解类型不适用于这种声明 @Query("artist_id") int Artist_id
- if-statement - 如何在 IF Vlookup 和 ISNA 公式中放置 AND 语句
- python - Selenium Python 脚本的 Cron SyntaxError
- python - 使用值从字典列表中访问字典
- visual-studio - Visual Studio 中 CPU 使用情况分析器中的类别是什么?
- java - Intellij中如何导入另一个java项目包并使用
- themes - 你能用 Python-pptx 改变现有 powerpoint 的主题吗?
- python - Python 什么时候真正写入文件?
- linux - 执行与另一个进程具有相同环境变量的进程
- r - 在 R 中附加一个向量