Django中如何将基础模型转换为代理模型?
优化Django代理模型实例化的优雅写法
你用代理模型ShuffledQuestion重载answers属性实现答案打乱的思路没问题,目前的实例化代码虽然能用,但可以简化得更优雅,推荐几种方案:
1. 简化字典传参
不用单独创建中间字典,直接在实例化时合并model_to_dict结果和外键对象:
from django.forms.models import model_to_dict new_question = ShuffledQuestion( **model_to_dict(question), quiz=question.quiz, group=question.group )
2. 自动遍历字段赋值
通过遍历原模型的字段自动获取所有属性值,无需手动处理外键:
field_values = { field.name: getattr(question, field.name) for field in Question._meta.get_fields() if not field.auto_created # 排除自动生成的反向关联字段 } new_question = ShuffledQuestion(**field_values)
3. 直接转换实例类型(按需使用)
如果不需要保留原Question实例,可以直接修改其类属性快速转为代理模型:
question.__class__ = ShuffledQuestion
注意:这种方式会修改原实例,若后续还要用原
Question对象,建议先复制再转换:import copy new_question = copy.copy(question) new_question.__class__ = ShuffledQuestion
补充说明
代理模型和原模型共享数据库表,如果你只是在内存中需要打乱答案的逻辑,第三种方法内存开销最小;如果要创建新的实例(即使数据库里不会新增记录),前两种方法更稳妥。
内容的提问来源于stack exchange,提问作者kutasek69
相关产品推荐
相关产品推荐

