Метод Restframework .save() не сохраняет объект в базе данных, а возвращает объект с новым PK

Я пытаюсь сохранить проверенный сериализатор в своей базе данных PostgreSQL 11.0, используя djangorestframework. Метод Restframework .save() возвращает объект с уникальной последовательностью PK (+1), но объект не сохраняется в базе данных.

Я попытался отладить метод .save() через отладчик Pycharm, и в конце концов оказалось, что он делает ModelClass.objects.create(**validated_data), если объект новый. Я проверил validated_data, и все было в порядке. Когда я сделал ModelClass.objects.create(data) вручную через оболочку с теми же проверенными данными, объект был создан в базе данных. Кажется, что один и тот же код сохраняется в БД из оболочки, но не из представления.

Когда я включил отладчик и вошел в метод save() restframework, оказалось, что в конце концов он делает это для новых объектов:

        try:
            instance = ModelClass.objects.create(**validated_data)
        except TypeError:
            #handle error

Мои тестовые данные вернули следующее значение для **validated_data:

{'strt_day': datetime.date(2000, 1, 24), 'end_day': datetime.date(2000, 1, 28), 'no_of_days': 5}

и после выполнения этой строки пример был объектом с PK 2077

Я открыл оболочку и сделал следующее:

In [1]: from core.models import UsrInDys                                                                                    

In [2]: import datetime                                                                                                     

In [3]: strt_day=datetime.date(2000, 1, 24)                                                                                 

In [4]: end_day=datetime.date(2000, 1, 28)                                                                                  

In [5]: no_of_days=5                                                                                                        

In [6]: UsrInDys.objects.create(strt_day=strt_day, end_day=end_day, no_of_days=no_of_days)                                  
Out[6]: <UsrInDys: UsrInDys object (2078)>

Когда я просматриваю свою таблицу через pgAdmin III, я вижу в таблице объект с PK 2078, но не 2077 (объект, созданный из метода restframework save())

Вот некоторые важные фрагменты из файлов моего проекта:

Внутри APIViewClass

def post(self, request):
    usr_in_dys_serializer = UserInDysSerializer(data=request.data)
    if usr_in_dys_serializer.is_valid():
        saved_usr_in_dys = usr_in_dys_serializer.save(no_of_days=no_of_days) # Output: UsrInDys object (2077) <---- but not being saved to the Database....

Внутри сериализатора.py

class UserInDysSerializer(serializers.ModelSerializer):

    class Meta:
        model = UsrInDys
        strt_day = serializers.DateField()
        end_day = serializers.DateField()
        fields = ('strt_day', 'end_day', 'no_of_days')
        extra_kwargs = {
             'no_of_days': {'read_only': True}
        }

Внутри model.py

class UsrInDys(models.Model):
    trip_id = models.AutoField(primary_key=True)
    strt_day = models.DateField()
    end_day = models.DateField()
    no_of_days = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'usr_in_dys'

    def __unicode__(self):
        return [self.strt_day, self.end_day]

Внутри settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': env("USER"),
        'PASSWORD': env("PASSWORD"),
        'HOST': env("HOST"),
        'PORT': '5433',
    }
}
DATABASES['default']['ATOMIC_REQUESTS'] = True

Детали системы:
-PostgreSQL версии 11.0
- Питон 3.5
- Джанго 2.2.1
- Django-restframework 3.8.2
- Линукс Минт 18.3

Как мне получить объекты для сохранения в базе данных и что вызывает такое поведение? Спасибо.

здесь 2077 похоже на ваш PK, и вы не получите его, если он не будет сохранен в БД

JPG 22.05.2019 11:23
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
1
222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Могу поспорить, что он сохранен, но благодаря транзакциям вы можете его не увидеть. После того, как вы создали что-то из API, но не создавайте другую строку через оболочку python, откройте оболочку Django и попробуйте:

from core.models import UsrInDys                                                                                    

UsrInDys.objects.order_by('-id').first()

это должно дать вам элемент, созданный через API.

Кстати, убедитесь, что API вернул результат, и у вас нет отладчика. Если ваш отладчик все еще активен, вероятно, транзакция API еще не завершена, а новая строка еще не зафиксирована, что означает, что вы не увидите ее в pgAdmin.

Оказывается, ошибка возникла из-за другого сериализатора внутри почтовой функции, и он не вставлял данные в БД, что вызывало ошибку IntegrityError, и запрос API не мог быть выполнен, следовательно, транзакция была незавершенной. Спасибо, что указали мне правильное направление. Ваше здоровье!

Sarthak Adhikari 22.05.2019 11:42

Другие вопросы по теме