Django DRF-使用序列化器+ json更新配置文件

时间:2018-10-04 09:51:40

标签: django django-rest-framework

我已经在这个问题上猛烈抨击了整整三天,并且可能阅读了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)。

感谢您的阅读,我的肩膀承受了巨大的负担...

1 个答案:

答案 0 :(得分:0)

我已经更改了更新方法,以对每个播放器执行以下操作:

instance.GK1 = PlayerID.objects.get(id=validated_data['GK1'].pop('id'))

换句话说,实例正在寻找Player对象(而不是ID的字符串表示形式)。因此,我弹出ID并通过对象的ID进行过滤(或.get)。

感谢您的阅读,我的肩膀承受了巨大的负担...