我已经在这个问题上猛烈抨击了整整三天,并且可能阅读了SO上的每个线程。警告=我对Django REST或Python不太满意。
总而言之,每个用户个人资料都有11个最初选择的足球运动员。我现在想通过发布json信息来更新/更改这些播放器。
views.py
elif request.method == 'POST':
jsondata = dict(request.data)
profile = Profile.objects.get(user=request.user)
serializer = ProfileSerializer(profile, data=jsondata, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
Serializers.py
class ProfileSerializer(serializers.ModelSerializer):
"""
Serializing all the Players
"""
#user = serializers.StringRelatedField()
GK1 = PlayerSerializer()
DF1 = PlayerSerializer()
DF2 = PlayerSerializer()
DF3 = PlayerSerializer()
DF4 = PlayerSerializer()
MF1 = PlayerSerializer()
MF2 = PlayerSerializer()
MF3 = PlayerSerializer()
MF4 = PlayerSerializer()
FW1 = PlayerSerializer()
FW2 = PlayerSerializer()
def create(self, validated_data):
return Profile.objects.create(**validated_data)
class Meta:
model = Profile
fields = ( "GK1", "DF1", "DF2", "DF3", "DF4", "MF1", "MF2", "MF3", "MF4", "MF5", "FW1", "FW2",)
现在作为测试,我试图仅更新GK1。我知道我通过POST获得了正确的json数据。我也知道实例数据是原始数据。但是它只是不会保存/更新!!!我已经覆盖了更新方法作为测试:
def update(self, instance, validated_data):
setattr(instance, "GK1.id", validated_data['GK1']['id'])
instance.save()
return instance
### set the id of GK1 to the id that arrives via POST
### GK1.id gives me '1008' - a Player object
### validated_data['GK1']['id'] gives me '1025' - id of another player
什么也没发生-ID在数据库中没有改变:(
这是我的主要问题-
validated_data是一个OrderedDict(精细)
实例是用户配置文件对象。
如何将OrderedDict数据压缩到Profile对象中?我可以简单地通过引用主外键来做到这一点吗?即ID?
我很抱歉这含糊不清,也许还缺少代码。但是DRF教程尚不清楚。任何帮助表示赞赏。
编辑-将json数据/ validated_data添加到评论中
EDIT2-我有一个可行的解决方案 我已经更改了更新方法,以对每个播放器执行以下操作: instance.GK1 = PlayerID.objects.get(id = validated_data ['GK1']。pop('id'))
换句话说,实例正在寻找Player对象(而不是ID的字符串表示形式)。因此,我弹出ID并通过对象的ID进行过滤(或.get)。
感谢您的阅读,我的肩膀承受了巨大的负担...
答案 0 :(得分:0)
我已经更改了更新方法,以对每个播放器执行以下操作:
instance.GK1 = PlayerID.objects.get(id=validated_data['GK1'].pop('id'))
换句话说,实例正在寻找Player对象(而不是ID的字符串表示形式)。因此,我弹出ID并通过对象的ID进行过滤(或.get)。
感谢您的阅读,我的肩膀承受了巨大的负担...