Я пытаюсь сохранить проверенный сериализатор в моей базе данных 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 (объект, созданный с помощью метода save () restframework)
Вот некоторые важные биты из файлов моего проекта:
Внутри 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....
Внутри serializer.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
- Python 3,5
- Джанго 2.2.1
- Django-restframework 3.8.2
- Linux Mint 18.3
Как получить объекты для сохранения в базе данных и что вызывает такое поведение? Спасибо.