【问题标题】:Django DRF - update profile using serializer + jsonDjango DRF - 使用序列化程序 + json 更新配置文件
【发布时间】: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


【解决方案1】:

我已更改更新方法,为每个玩家执行以下操作:

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

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

感谢阅读,我肩上的担子很重...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多