Как установить значение Foreignkey в дочернем сериализаторе в Django Rest Framework, когда существует родительская запись - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть две модели сначала как родительская модель "Страна", которые заполнены до второй как дочерняя модель "Город".как следующий

class Country(models.Model):
    name = models.CharField(max_length=35)
    icon = models.ImageField()

    def __str__(self):
        return self.name


class City(models.Model):
    name = models.CharField(max_length=35)
    country = models.ForeignKey(to=Country, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

Мой serializers.py для моей потребности следующим образом:

class CountrySerializer(ModelSerializer):
    class Meta:

        model = Country
        fields = '__all__'

class CitySerializer(ModelSerializer):
    country = serializers.PrimaryKeyRelatedField(queryset=Country.objects.all())

    class Meta:

        model = City
        fields = ('name', 'country')

view.py

class CountryAPIView(ListAPIView):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    permission_classes = [AllowAny, AllowAnonymous]


class CityAPIView(ListAPIView):
    queryset = City.objects.all()
    serializer_class = CitySerializer
    permission_classes = [AllowAny, AllowAnonymous]

    def post(self, request):

        serializer = CitySerializer(data=request.data)
        if serializer.is_valid(raise_exception=ValueError):
            serializer.create(validated_data=request.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                        status=status.HTTP_400_BAD_REQUEST)

теперь, когда я запускаю get api itбеги и даешь результат в порядке.Но когда я пытаюсь создать новый город и установить «страну»: «id» в json, я получил эту ошибку

Невозможно присвоить «2»: «City.country» должен быть экземпляром «Country».

Так что, если мне неясно, что мне нужно, это точно установить внешний ключ для города, когда я создаю город, а не создавать город и страну,

, пожалуйста, у кого-нибудь была помощь в решении,потому что я попробовал много способов и прочитал об этом в документации по django rest framework, но у меня ничего не вышло.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Прежде всего, raise_exception должно быть логическим значением (либо True, либо False)

Вы можете избежать этой ошибки, используя наследование класса представления от ListCreateAPIView

<code>
<b>from rest_framework.generics import ListCreateAPIView</b></p>

<p>class CityAPIView(<b>ListCreateAPIView</b>):
    queryset = City.objects.all()
    serializer_class = CitySerializer
    permission_classes = [AllowAny, AllowAnonymous]
Вы не хотите использовать метод post(), есливы используете ListCreateAPIView, потому что DRF хорошо позаботится об этой части.

Предложение
Поскольку вы имеете дело с CRUD функциональных возможностей модели, вы можете использовать DRF ModelViewset class

0 голосов
/ 24 сентября 2018

вы не используете проверенные данные для создания нового города, просто измените эту строку:

        serializer.create(validated_data=request.data)

на эту:

        serializer.save()

при выполнении serializer.save(),Сериализатор будет использовать свои проверенные данные.

также, у DRF есть общее представление ( ListCreateAPIView ), которое охватывает ваш вариант использования.

...