gpt4 book ai didi

Django Rest Framework SerializerMethodField 仅在 GET 请求上

转载 作者:行者123 更新时间:2023-12-02 00:31:43 24 4
gpt4 key购买 nike

我的 DRF 后端在这里遇到了一些小问题。

我正在用某些型号的选项填充字段。

我对一个模型有外键要求。当我创建模型时,我想将它保存在外国 ID 下。

当我请求模型时,无论选择字段映射到什么,我都想要模型。

我能够使用 SerializerMethodField 执行此操作,但是当我尝试创建模型时,我收到 400 错误,因为该 block 无效。如果我删除 SerializerMethodField,我可以保存,但从请求中获取存储在数据库中的数字。

如有任何帮助,我们将不胜感激。

class BlockViewSet(ModelViewSet):
model = apps.get_model('backend', 'Block')
queryset = model.objects.all()
serializer_class = serializers.BlockSerializer
permissions = ('All',)

def create(self, request, format=None):
data = request.data
data['user'] = request.user.id
data['goal'] = WorkoutGoal.objects.get(goal=data['goal']).id
block = serializers.BlockSerializer(data=data, context={'request': request})
if block.is_valid():
new_block = block.save()
return Response({'block': {'name': new_block.name, 'id': new_block.id}}, status=status.HTTP_201_CREATED)
else:
return Response(block.errors, status=status.HTTP_400_BAD_REQUEST)

class WorkoutGoalSerializer(serializers.ModelSerializer):
class Meta:
model = apps.get_model('backend', 'WorkoutGoal')
fields = ('goal',)

goal = serializers.SerializerMethodField(read_only=True, source='get_goal')

def get_goal(self, obj):
return dict(WorkoutGoal.GOALS).get(obj.goal)

class BlockSerializer(serializers.ModelSerializer):
workout_count = serializers.IntegerField(required=False)
completed_workouts = serializers.IntegerField(required=False)
goal = WorkoutGoalSerializer()

class Meta:
model = apps.get_model('backend', 'Block')
read_only_fields = ('workout_count', 'completed_workouts')
fields = read_only_fields + ('id', 'name', 'user', 'created', 'goal')

上面的代码返回了正确的选择,但是我不能在它下面保存。删除 goal = WorkoutGoalSerializer() 并保存但不返回映射的选择。

最佳答案

我认为这会很有效,

class WorkoutGoalSerializer(serializers.ModelSerializer):
<b>def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'request' in self.context and self.context['request'].method == 'GET':
self.fields['goal'] = serializers.SerializerMethodField(read_only=True, source='get_goal')</b>

class Meta:
model = apps.get_model('backend', 'WorkoutGoal')
fields = ('goal',)

<strike>goal = serializers.SerializerMethodField(read_only=True, source='get_goal')</strike> <b># remove this line</b>

def get_goal(self, obj):
return dict(WorkoutGoal.GOALS).get(obj.goal)

这是如何运作的?
如果请求的方法是 ,它将使用 SerializerMethodField 重新启动 goal 字段获取

记住一件事,你应该删除那行

goal = serializers.SerializerMethodField(read_only=True, source='get_goal')

关于Django Rest Framework SerializerMethodField 仅在 GET 请求上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51601330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com