如何将自定义存储函数改写为Django Message模型类方法并返回保存对象ID
Django Message模型自定义创建方法实现方案
你当前使用静态方法的实现可正常运行,但更符合Django开发惯例的是用类方法实现,该方法属于类级别的操作,专门用于从外部对象构造并保存模型实例,比静态方法语义更清晰、可维护性更高。
代码实现
from django.db import models class Message(models.Model): # 此处保留你原有的模型字段定义 message_id = models.CharField(max_length=255, unique=True) subject = models.CharField(max_length=512) sender = models.EmailField() has_attachments = models.BooleanField(default=False) sent_date = models.DateTimeField() received_date = models.DateTimeField() # 其他字段省略... @classmethod def save_from_external_message(cls, message, message_id): # cls参数指向当前Message类,无需硬编码类名,后续修改类名也无需调整此处逻辑 mex = cls( message_id=message_id, subject=message.subject, sender=message.sender.address, has_attachments=message.has_attachments, sent_date=message.sent, received_date=message.received ) mex.save() return mex
调用方式
# 传入你的外部message对象和对应message_id即可 saved_instance = Message.save_from_external_message(your_message, your_message_id) # 直接获取保存后自动生成的主键ID print(saved_instance.pk)
super()相关疑问说明
当前场景完全不需要调用super():该方法是你自定义的业务方法,没有重写Django Model父类的任何内置方法(如__init__、save、create等),不存在需要继承执行的父类逻辑。如果PyCharm弹出要求调用super()的报错提示,属于IDE静态检查的误判,可直接忽略,也可在方法上方添加注释# noinspection PyMethodOverriding消除提示。
如果之前你尝试写普通成员方法(第一个参数为self)报错,是因为实例方法需要先创建类实例才能调用,和你要创建实例的需求冲突,因此不适用当前场景。
内容的提问来源于stack exchange,提问作者Edoardo Zucchelli
相关产品推荐
相关产品推荐

