Как решить ключевую ошибку во вложенном представлении модели в Django - PullRequest
0 голосов
/ 21 марта 2019

Это моя модель:

class MyModel(models.Model):
    ID = models.ForeignKey(OtherModel,related_name='NewModel', on_delete=models.CASCADE)
    start = models.BigIntegerField()
    duration = models.BigIntegerField(default= 30)
    value = models.IntegerField()

где OtherModel имеет 2 поля, biginteger и foreignkey. Я пытаюсь создать экземпляр MyModel, и это дает мне ключевую ошибку. Сериализатор, как показано ниже:

class ModifyReadingSerializer(serializers.Serializer):
    duration =  serializers.IntegerField()
    start =  serializers.IntegerField()

class OriginalSerializer(serializers.ModelSerializer):
    timePeriod = ModifyReadingSerializer(source = '*')
    class Meta:
        model = MyModel
        fields = ('timePeriod', 'value',)

А вид для его создания показан ниже:

class RegisterValues(generics.ListCreateAPIView):
    ''' GET/POST  urltemp/{ID = pk}'''
    queryset = MyModel.objects.all()
    serializer_class = OriginalSerializer

    def post(self, request, *args, **kwargs):
        s1 = OtherModel.objects.get(mRID=kwargs["pk"])
        a_temp = MyModel.objects.create(
            ID=s1,
            value=request.data["value"],
            duration=request.data["duration"],
            start=request.data["start"],)
        return Response(data=OriginalSerializer(a_temp).data)

Я получаю следующую ошибку KeyError на /urltemp/1 'duration'. Я понимаю, почему я получаю ошибку, но не уверен, как ее исправить, сохраняя вложенное представление. И я вижу ошибку в строке, где я создаю продолжительность (я вижу это в терминале).

РЕДАКТИРОВАТЬ: ДОБАВЛЕНО ЗАГРУЗКА

{
    "timePeriod": {
        "duration": 30,
        "start": 24
    },
    "value": 34,
}

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

Попробуйте этот фрагмент,

class RegisterValues(generics.ListCreateAPIView):
    ''' GET/POST  urltemp/{ID = pk}'''
    queryset = MyModel.objects.all()
    serializer_class = OriginalSerializer

    def post(self, request, *args, **kwargs):
        s1 = OtherModel.objects.get(mRID=kwargs["pk"])
        a_temp = MyModel.objects.create(
            ID=s1,
            value=request.data["value"],
            <b>duration=request.data["timePeriod"]["duration"],
            start=request.data["timePeriod"]["start"], )</b>
        return Response(data=OriginalSerializer(a_temp).data)
0 голосов
/ 21 марта 2019

Ошибка, похоже, не имеет никакого отношения к структуре вашей модели.Поскольку это KeyError, проблема в том, что в request.data нет значения, связанного с ключом duration.

Другими словами, вы должны вызывать свой API без поля с именем durantionв теле запроса.

Убедитесь, что вы вызываете конечную точку API, включая в теле запроса все поля, к которым вы пытаетесь обратиться в своем коде, и эта ошибка должна исчезнуть.

...