我正在尝试使用djangorestframework将经过验证的序列化器保存在我的PostgreSQL 11.0数据库中。 Restframework的.save()方法返回的对象具有唯一的PK(+1序列),但是该对象没有保存到数据库中。
我尝试通过Pycharm的Debugger调试.save()方法,最后结果是,如果对象是新对象,它将执行ModelClass.objects.create(** validated_data)。我检查了validated_data,一切似乎都很好。当我通过外壳使用相同的经过验证的数据手动执行ModelClass.objects.create(data)时,该对象已在数据库中创建。似乎相同的代码正在从外壳程序保存到DB,而不是从视图保存到数据库。
当我打开调试器并进入restframework的save()方法时,最后证明它是对新对象执行的操作
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}
并且在执行该行之后, instance 是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....
内部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}
}
内部模型。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
-Django 2.2.1
-Django-restframework 3.8.2
-Linux Mint 18.3
如何获取对象以保存在数据库中,这是什么引起的?谢谢。
答案 0 :(得分:1)
我敢打赌,它已保存,但是由于交易,您可能看不到它。 通过API创建了某些内容-但不要通过python shell创建另一行之后,请打开Django shell并尝试:
from core.models import UsrInDys
UsrInDys.objects.order_by('-id').first()
应该为您提供通过API创建的商品。
顺便说一句,请确保API确实返回了结果,并且您没有待处理的调试器。如果调试器仍处于活动状态,则可能是API事务尚未完成,并且尚未提交新行,这意味着您将不会在pgAdmin中看到它。