[英]How to add a serializer field in DRF for GET only not POST?
I am working on an existing DRF codebase and want to add a last_build field to return on a GET request only.我正在处理现有的 DRF 代码库,并希望添加一个 last_build 字段以仅在 GET 请求时返回。 I do NOT want this to affect anything to do with POST requests.我不希望这影响与 POST 请求有关的任何事情。 I have created a method that returns the field I am looking for and have successfully tested that it returns the data I want, however I have not yet tested if this will affect existing POST requests.我创建了一个返回我正在寻找的字段的方法,并成功测试了它返回了我想要的数据,但是我还没有测试这是否会影响现有的 POST 请求。
class JobSerializer(serializers.ModelSerializer):
name = serializers.CharField(required=True, max_length=150)
product = ProductSerializer(many=False, required=True)
platform = PlatformSerializer(many=False, required=True)
stages = StageSerializer(many=True, required=False)
last_build = serializers.SerializerMethodField()
def get_last_build(self, name):
latest_build = JobExecution.manager.filter(job__name=name.name)
return latest_build.last().build_id
class Meta:
model = Job
fields = ("name", "product", "platform", "stages", "last_build")
validators = [
UniqueTogetherValidator(
queryset=Job.manager.all(), fields=("name", "platform", "product")
)
]
def create(self, validated_data):
# Create objects from data
try:
product_data = validated_data.pop("product", None)
if product_data:
ps = ProductSerializer()
validated_data["product"] = ps.create(product_data)
else:
logger.exception("product is not valid")
platform_data = validated_data.pop("platform", None)
if platform_data:
ps = PlatformSerializer()
validated_data["platform"] = ps.create(platform_data)
else:
logger.exception("platform is not valid")
stage_data = validated_data.pop("stages", [])
stages = []
the_job = Job.manager.get_or_create(**validated_data)[0]
if stage_data:
for stage_data in stage_data:
ss = StageSerializer()
stage_data["job"] = the_job
the_stage = ss.create(stage_data)
return the_job
except Exception as e:
logger.exception(e)
raise e
Here is a snippet of the api view for post:这是帖子的 api 视图的片段:
class JobView(GenericAPIView):
def post(self, request, format=None):
serializer = JobSerializer(data=request.data)
logger.debug(request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
logger.info("POST request for Job failed: %s", serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
You can add some fields for serializer method filed for skip on POST/PUT/PATCH requests.您可以为序列化程序方法添加一些字段,以便在 POST/PUT/PATCH 请求上跳过。 Add required=False for skip checking data, and read_only=True for skip POST request.添加required=False跳过检查数据, read_only=True跳过 POST 请求。
Example:例子:
class JobSerializer(serializers.ModelSerializer):
name = serializers.CharField(required=True, max_length=150)
product = ProductSerializer(many=False, required=True)
platform = PlatformSerializer(many=False, required=True)
stages = StageSerializer(many=True, required=False)
last_build = serializers.SerializerMethodField(required=False, read_only=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.