You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:47