复制/克隆Django Mod

2024-03-28 12:40:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想复制这个模型

class Quiz(models.Model):

title = models.CharField(
    verbose_name=_("Title"),
    max_length=60, blank=False)

description = models.TextField(
    verbose_name=_("Description"),
    blank=True, help_text=_("a description of the quiz"))

url = models.SlugField(
    max_length=60, blank=False,
    help_text=_("a user friendly url"),
    verbose_name=_("user friendly url"))

category = models.ForeignKey(
    Category, null=True, blank=True,
    verbose_name=_("Category"))

random_order = models.BooleanField(
    blank=False, default=False,
    verbose_name=_("Random Order"),
    help_text=_("Display the questions in "
                "a random order or as they "
                "are set?"))

max_questions = models.PositiveIntegerField(
    blank=True, null=True, verbose_name=_("Max Questions"),
    help_text=_("Number of questions to be answered on each attempt."))

answers_at_end = models.BooleanField(
    blank=False, default=False,
    help_text=_("Correct answer is NOT shown after question."
                " Answers displayed at the end."),
    verbose_name=_("Answers at end"))

exam_paper = models.BooleanField(
    blank=False, default=False,
    help_text=_("If yes, the result of each"
                " attempt by a user will be"
                " stored. Necessary for marking."),
    verbose_name=_("Exam Paper"))

single_attempt = models.BooleanField(
    blank=False, default=False,
    help_text=_("If yes, only one attempt by"
                " a user will be permitted."
                " Non users cannot sit this exam."),
    verbose_name=_("Single Attempt"))

pass_mark = models.SmallIntegerField(
    blank=True, default=0,
    verbose_name=_("Pass Mark"),
    help_text=_("Percentage required to pass exam."),
    validators=[MaxValueValidator(100)])

success_text = models.TextField(
    blank=True, help_text=_("Displayed if user passes."),
    verbose_name=_("Success Text"))

fail_text = models.TextField(
    verbose_name=_("Fail Text"),
    blank=True, help_text=_("Displayed if user fails."))

draft = models.BooleanField(
    blank=True, default=False,
    verbose_name=_("Draft"),
    help_text=_("If yes, the quiz is not displayed"
                " in the quiz list and can only be"
                " taken by users who can edit"
                " quizzes."))

基本上这是个小测验。它有自己的问题可以添加到django管理中。现在,当我复制这个模型时,复制品的问题就不存在了。在

我用这个复制一份。在

^{pr2}$

这是测试的副本,但问题不在那里。现在有一些代码在管理员py关于测验的问题。可能会有帮助。在

class QuizAdminForm(forms.ModelForm):
"""
below is from
https://stackoverflow.com/questions/11657682/
django-admin-interface-using-horizontal-filter-with-
inline-manytomany-field
"""

class Meta:
    model = Quiz
    exclude = []

questions = forms.ModelMultipleChoiceField(
    queryset=Question.objects.all().select_subclasses(),
    required=False,
    label=_("Questions"),
    widget=FilteredSelectMultiple(
        verbose_name=_("Questions"),
        is_stacked=False))

def __init__(self, *args, **kwargs):
    super(QuizAdminForm, self).__init__(*args, **kwargs)
    if self.instance.pk:
        self.fields['questions'].initial =\
            self.instance.question_set.all().select_subclasses()

def save(self, commit=True):
    quiz = super(QuizAdminForm, self).save(commit=False)
    quiz.save()
    quiz.question_set = self.cleaned_data['questions']
    self.save_m2m()
    return quiz

我怎么能用原版的问题来复制这个模型?在


Tags: thetextnameselffalsetruedefaultverbose
2条回答

最终的解决方案是:

quiz = Quiz.objects.get(pk=pkofquiziwanttocopy)
quiz.pk = None
quiz.save()
old_quiz = Quiz.objects.get(pk=pkofquiziwanttocopy)

quiz.question_set=old_quiz.question_set.all()

假设Question模型有一个Quiz的外键,可以像克隆测验一样克隆问题:

quiz = Quiz.objects.get(pk=pkofquiziwanttocopy)
quiz.pk = None
quiz.save()
old_quiz = Quiz.objects.get(pk=pkofquiziwanttocopy)
for quest in old_quiz.question_set.all():
    quest.pk = None
    quest.quiz = quiz
    quest.save()

相关问题 更多 >