Skip to main content
 首页 » 编程设计

python之Django之使用 2 个嵌套外键复制模型实例

2024年10月25日32zlslch

我是 django 的新手,我有一个调查应用程序,管理员在其中创建有问题的调查,问题有选择......我已经将 save_as = True 添加到我的调查管理员,但是当我复制调查时,问题出现在文案中,但选项没有..

class SurveyAdmin(admin.ModelAdmin): 
    save_as = True 
    prepopulated_fields = { "slug": ("name",),} 
    fields = ['name', 'insertion', 'pub_date', 'description', 'external_survey_url', 'minutes_allowed', 'slug'] 
    inlines = [QuestionInline, SurveyImageInLine] 

我试图在 save_model 方法中使用 deepcopy,但是得到 “NOT NULL constraint failed: assessment_question.survey_id”,从回溯来看,尝试保存时问题的 pk 似乎为 None。有没有更好的方法通过管理员复制调查,或者我如何修复我的 deepcopy 应用程序?

def save_model(self, request, obj, form, change): 
    if '_saveasnew' in request.POST: 
        new_obj = deepcopy(obj) 
        new_obj.pk = None 
        new_obj.save() 

提前感谢您的帮助。

请您参考如下方法:

最终放弃了所有的 save_as 并编写了一个管理操作来正确复制我需要的所有字段......

actions = ['duplicate'] 
 
from copy import deepcopy 
 
def duplicate(self, request, queryset): 
    for obj in queryset: 
        obj_copy = deepcopy(obj) 
        obj_copy.id = None 
        obj_copy.save() 
 
        for question in obj.question_set.all(): 
            question_copy = deepcopy(question) 
            question_copy.id = None 
            question_copy.save() 
            obj_copy.question_set.add(question_copy) 
 
            for choice in question.choice_set.all(): 
                choice_copy = deepcopy(choice) 
                choice_copy.id = None 
                choice_copy.save() 
                question_copy.choice_set.add(choice_copy) 
        obj_copy.save()