django - Django Rest Framework:在 ModelViewSet 中覆盖 perform_create 的正确方法?
问题描述
我现在已经解决了这个问题,所以向下滚动到问题的底部以查看解决方案
在 Django Rest Framework 中,当在一个模型上进行插入时,我想在其他模型上进行更新/插入。
我正在使用 aModelViewSet
并尝试覆盖该perform_create
方法,但原始插入只是被吞没,没有发生更新,也没有看到错误。
我试过这样做
def perform_create(self, serializer):
serializer.save()
但是虽然没有抛出错误,但也没有发生更新。
希望有一个覆盖示例,perform_create
以便原始插入仍然发生,但同时有进行其他更新/插入的空间。
我正在使用 DRF 3.5.3 。
编辑:这是完整的 ModelViewSet 代码。
class AttemptViewSet(viewsets.ModelViewSet):
'''
API endpoint that allows Attempt to be CRUDed.
'''
queryset = Attempt.objects.all()
serializer_class = AttemptSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
def perform_create(self, serializer):
import pdb;pdb.set_trace()
serializer.save()
def initial(self, request, *args, **kwargs):
'''
Temporary diagnostic code which should
be removed once it's possible to update
an Attempt
'''
import os
import json
# 'request_auth': request.auth,
log_data = {
'user': request.user.pk,
'remote_address': request.META['REMOTE_ADDR'],
'request_method': request.method,
'request_path': request.get_full_path(),
'request_body': request.data ,
'request_query_params': request.query_params
}
if not os.path.exists('/tmp/spellsplashlog'):
os.makedirs('/tmp/spellsplashlog')
with open('/tmp/spellsplashlog/logging.json', 'w') as f:
json.dump(log_data, f, sort_keys=True, indent=4)
viewsets.ModelViewSet.initial(self, request, *args, **kwargs)
...这是序列化程序...
class AttemptSerializer(serializers.ModelSerializer):
class Meta:
model = Attempt
fields = '__all__'
...这是模型...
class Attempt(models.Model):
learner = models.ForeignKey(Learner, related_name='learnerattempts')
word = models.ForeignKey(Word, related_name='wordattempts')
when = models.DateTimeField(auto_now_add=True)
success = models.BooleanField(default=False)
class Meta:
ordering = ['-when']
class JSONAPIMeta:
resource_name = "attempts"
def __str__(self):
formatted_when = localtime(self.when).strftime('%d-%b-%Y %X')
if self.success:
formatted_success = "YES"
else:
formatted_success = "NO"
return u'%s - %s- Success ?: %s ' % (self.word, formatted_when, formatted_success)
编辑(和决议)
好的,所以我对 进行了一些更改,perform_create
似乎 DRF 不喜欢以某种非常微妙的方式嵌入pdb.set_trace
。它不会大声失败,但它只是没有响应。一旦我删除它,它就会按我的预期工作。
FWIW在调查过程中我也改了
serializer.save
至
super().perform_create(serializer)
但实际上,一旦pdb.set_trace
删除,这两个中的任何一个都可以工作。
解决方案
您可以在 serializer.save 方法获得调用后更新另一个模型。
def perform_create(serializer):
serializer.save()
### here you can write the other logic of update
### you can use the signal, just raise signal on save of that model
推荐阅读
- typo3 - 将自定义函数调用分配给变量
- php - 在没有初始 Sql 数据库的情况下检索 Joomla sql 数据库
- c# - Specflow 功能文件代码-数据定义 c#
- ios - 即使应用程序终止,也会执行后台进程
- node.js - 连接失败时 node-postgres 重新连接
- java - Google Apis Nearest Roads 来截断道路
- java - getCanonicalPath 在不同平台之间返回不同的路径
- r - 生成 n 值为“x”和 p 值为“y”的列表
- bash - 如何捕获后台进程的PID
- php - 参数 1 传递给 Doctrine\Common\EventManager::addEventSubscriber()