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

Django Rest Framework v3.0: как сопоставить настраиваемые поля сериализатора с полем модели при сохранении объекта?

Представление на основе моего класса выглядит следующим образом. «Получить» используется для перечисления всех бронирований, а «Опубликовать» — для создания нового бронирования.

class BookingList(APIView):
    def get(self, request, format=None):
        bookings = Booking.objects.all()
        paginator = Paginator(bookings, 10)
        page = paginator.page(1)
        serializer = BookingSerializer(page.object_list, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = BookingSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

И мой класс Serializer выглядит так.

class BookingSerializer(serializers.HyperlinkedModelSerializer):
    field1 = serializers.SerializerMethodField('get_alternate_var1')
    field2 = serializers.SerializerMethodField('get_alternate_var2')

    class Meta:
        model = Booking
        fields = ('field1', 'field2','var3','var4')

    def get_alternate_field1(self, obj):
        return obj.var1

    def get_alternate_field2(self,obj):
        return obj.var2 

class Booking(models.Model):
    var1 = models.CharField(max_length=200)
    var2 = models.CharField(max_length=200)
    var3 = models.CharField(max_length=200)
    var4 = models.CharField(max_length=200)
    ....

Теперь это отлично работает с методом GET. Как создать новый объект с помощью POST? Моими параметрами сообщения являются field1, field2, var3, и я должен добавить значение по умолчанию (uuid) к var4 перед сохранением. Я не могу сопоставить field1, field2 с моделями var1 и var2. Как решить эту проблему?


Ответы:


1

Вызовы serializer.save() должны создать новый экземпляр. Из документов

Вызов .save() либо создаст новый экземпляр, либо обновит существующий экземпляр, в зависимости от того, был ли передан существующий экземпляр при создании экземпляра класса сериализатора:

Я бы изменил ваши имена параметров в сообщении, чтобы они соответствовали именам ваших моделей. Или вручную в сообщении измените словарь данных, чтобы эти переменные были там, прежде чем передавать их вашему сериализатору.

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

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

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

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

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

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

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

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