python - 如何追溯保存扩展的 Django 模型?
问题描述
我正在尝试使用继承来扩展 Django 模型。我有一个自定义模型,例如:
from request.models import Request
class RequestExtended(Request):
start_time = DateTimeField(_('start time'), default=None, db_index=True, blank=True, null=True, editable=False)
total_seconds = FloatField(_('total seconds'), default=None, db_index=True, blank=True, null=True, editable=False)
def save(self, *args, **kwargs):
start_time = get_current_request_start()
total_seconds = None
if start_time and self.time:
total_seconds = (self.time - start_time).total_seconds()
self.start_time = start_time
self.total_seconds = total_seconds
super(RequestExtended, self).save(*args, **kwargs)
应用程序中有一个中间件,它会为每个处理的 Django 请求request
自动保存一条新request
记录,但这不会自动触发我扩展模型的创建。所以我尝试添加一个post_save
信号,例如:
def post_request_save(sender, instance, **kwargs):
print('request.id:', instance.id, instance.ip)
RequestExtended.objects.get_or_create(request_ptr=instance)
post_save.connect(post_request_save, sender=Request)
但是,这会引发错误,因为RequestExtended
它忽略了我的request_ptr
值并尝试实例化一个空白Request
实例而不填写任何必填字段。
您如何创建通过继承扩展的模型并将其链接到它应该扩展的现有记录?
解决方案
经过进一步研究,我发现这个 Reddit 评论解释了这个问题。
即使我的模型没有复制父模型中的字段,因为 Python 层直接模拟了包含所有字段的继承模型,所以我需要在创建父对象时包含父对象中的所有字段。否则,即使我指定了ptr
对象,它也会尝试将它们设置为空白值。
所以正确的代码是:
def post_request_save(sender, instance, **kwargs):
o = RequestExtended()
o.__dict__.update(instance.__dict__)
o.save()
推荐阅读
- javascript - javascript onClick中的函数()与函数问题
- apache-kafka - 如何在 Batch listener 错误处理场景中读取 Header 值
- linux-kernel - 实现AMG8xx红外相机内核模块和Video4Linux
- python - 使用 Pandas 中其他行的排列生成新行
- php - 使用 Symfony 使用 api 填充实体属性
- kotlin - 如果不为空,则取字符串未按预期工作
- facebook - Facebook 登录问题无法获取响应代码
- python - 将循环函数输出存储到列表中
- pandas - Pandas:索引的某些部分作为重复列值
- python - 如何在可以访问 C 函数的 C 中动态运行 python 代码