【发布时间】:2018-10-04 09:51:39
【问题描述】:
我已经为此苦恼了整整 3 天,并且可能阅读了 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 对象中?我可以简单地通过引用主外键来做到这一点吗? IE。身份证?
我很抱歉这是多么含糊,也许缺少代码。但是DRF教程不清楚恕我直言。非常感谢任何帮助。
编辑 - json 数据/已验证数据添加到 cmets
EDIT2 - 我有一个可行的解决方案 我更改了更新方法,为每个玩家执行以下操作: instance.GK1 = PlayerID.objects.get(id=validated_data['GK1'].pop('id'))
或者换句话说,该实例正在寻找 Player OBJECTS(而不是 id 的字符串表示形式)。因此,我弹出了 id 并通过对象的 id 过滤(或 .get)。
感谢阅读,我肩上的担子很重...
【问题讨论】:
-
能不能把json文件也发一下
-
你不想要 jsondata = dict(request.data)。因为 request.data 是字典。
-
打印(validated_data) --- pastebin.com/064DfwjY
-
@a_k_v 也许我理解错了,但 serializer.is_valid() 只会给我一个有序的 dict 以在序列化程序中使用。
-
是的,没错。
标签: django django-rest-framework