Django DRF - обновить профиль с помощью сериализатора + json - PullRequest
0 голосов
/ 04 октября 2018

Я бьюсь головой об стену об этом вот уже 3 полных дня и, наверное, читаю каждую ветку по SO.Предупреждение = Я не очень хорошо разбираюсь в Django REST или Python.

Подводя итог, можно сказать, что в каждом профиле пользователя есть 11 футболистов, которых они изначально выбрали.Теперь я хочу обновить / изменить этих игроков с помощью POSTing json info.

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.Я знаю, что я получаю правильные данные JSON через POST.Я также знаю, что данные экземпляра являются исходными данными.Однако это просто не будет сохранять / обновлять !!!Я переопределил метод обновления как тест:

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

Ничего не происходит - идентификатор не изменяется в БД: (

Вот мой главный вопрос -

validated_dataтакое экземпляр OrderedDict (штраф)

является объектом профиля пользователя.

Как втиснуть данные OrderedDict в объект профиля? Могу ли я сделать это просто путем ссылки на первичный внешний ключ? Т.е.id?

Я очень сожалею о том, насколько это расплывчато и, возможно, об отсутствии кода. Но учебник по DRF не ясен, imho. Любая помощь очень ценится.

EDIT -json data / validated_data добавлен в комментарии

EDIT2 - у меня есть рабочее решение Я изменил метод обновления, чтобы сделать следующее для каждого игрока: instance.GK1 = PlayerID.objects.get (id = validated_data ['GK1']. pop ('id'))

Или, другими словами, экземпляр искал ОБЪЕКТЫ игрока (а не строковое представление идентификатора). ПоэтомуЯ выдал идентификатор и отфильтровал (или .get) поидентификатор объекта.

Спасибо за чтение, у меня с плеч огромный вес ...

1 Ответ

0 голосов
/ 04 октября 2018

Я изменил метод обновления, чтобы сделать следующее для каждого игрока:

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

Иными словами, экземпляр искал ОБЪЕКТЫ игрока (а не строку).представление идентификатора).Поэтому я выдал идентификатор и отфильтровал (или .get) по идентификатору объекта.

Спасибо за чтение, у меня с плеч огромный вес ...

...