Nano Hash - криптовалюты, майнинг, программирование

как установить значение внешнего ключа в дочернем сериализаторе в структуре django rest, когда существует родительская запись

У меня есть две модели: сначала в качестве родительской модели «Страна», которые заполняются перед второй в качестве дочерней модели «Город». в дальнейшем

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, он запускается и дает мне хороший результат. Но когда я пытаюсь создать новый город и установить «страну»: «id» в json, я получаю эту ошибку

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

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

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


Ответы:


1

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

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


from rest_framework.generics import ListCreateAPIView

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

Вы не хотите использовать post(), если вы используете ListCreateAPIView, потому что DRF хорошо позаботится об этой части.

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

25.09.2018
  • не могли бы вы увидеть этот вопрос, stackoverflow.com /questions/52850354/ большое спасибо @JPG 17.10.2018

  • 2

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

            serializer.create(validated_data=request.data)
    

    к этому:

            serializer.save()
    

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

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

    24.09.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..