django - Restframework 的 .save() 方法不会将对象保存到数据库,而是返回一个带有新 PK 的对象
问题描述
我正在尝试使用 djangorestframework 在我的 PostgreSQL 11.0 数据库中保存经过验证的序列化程序。Restframework 的 .save() 方法返回一个具有唯一 PK(+1 序列)的对象,但该对象并未保存到数据库中。
我尝试通过 Pycharm 的调试器调试 .save() 方法,结果证明,如果对象是新的,它会执行 ModelClass.objects.create(**validated_data) 。我检查了validated_data,一切似乎都很好。当我使用相同的验证数据通过 shell 手动执行 ModelClass.objects.create(data) 时,在数据库中创建了对象。似乎相同的代码正在从 shell 中保存到 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}
并且在执行该行之后,实例是一个具有 PK 2077 的对象
我打开了一个 shell 并执行了以下操作:
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
如何让对象保存在数据库中,是什么导致了这种行为?谢谢你。
解决方案
我敢打赌,它已被保存,但由于交易,您可能看不到它。从 API 创建了一些东西之后——但不要通过 python shell 创建另一行——,打开一个 Django shell 并尝试:
from core.models import UsrInDys
UsrInDys.objects.order_by('-id').first()
这应该为您提供通过 API 创建的项目。
顺便说一句,确保 API 确实返回了结果,并且您没有挂起调试器。如果您的调试器仍然处于活动状态,则很可能 API 事务尚未完成并且新行尚未提交,这意味着您不会在 pgAdmin 中看到它。
推荐阅读
- php - 为什么在我的 Symfony 网络服务器(使用 Apache)上配置正确时出现错误 403?
- python - 从python中的类函数内部通过字符串调用函数
- docusignapi - 我们应该如何允许我们的网络应用程序的个人用户连接到他们自己的 DocuSign 帐户?
- wcf - 尝试使用 tcp 从托管 wcf 的服务器机器上的虚拟机上的客户端机器获取数据时出现错误 onwindows 服务
- jquery - Jquery 无法处理多次使用的 Vue 组件
- kubernetes - 无法使用 Minikube 在 Kubernetes 集群上本地运行 Mattermost
- javascript - 如何将函数调用添加到任务队列中?
- c++ - 将 C++ 模板参数转换为结构中的字符串
- powershell - 如何在 Windows 上将图像传递给 vagrant
- flutter - 在函数返回值之前等待流完成