Django,如何将基础模型转换为代理模型

hpcdzsge  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(175)

在我的代码中有一个地方,我需要重载模型的属性。为此,我使用了我的基本示例的代理模型。
型号:

class Question(TimeTrack):
    class Types(models.TextChoices):
        SINGLE_CHOICE = "SC", _("single_choice")
        MANY_CHOICE = "MC", _("many_choice")
        TRUE_FALSE = "TF", _("true_false")
        CHRONOLOGY = "CHR", _("chronology")
        MATCHING = "MCH", _("matching")

    position = models.PositiveIntegerField()
    text = models.CharField(max_length=512)
    image_src = models.CharField(max_length=256, blank=True, null=True)
    time = models.PositiveIntegerField()
    feedback = models.CharField(max_length=512)
    type = models.CharField(max_length=30, choices=Types.choices)
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

    @property
    def answers(self):
        return self.answer_set.all()

    @property
    def correct_answers(self):
        return self.answer_set.filter(is_correct=True)

    def __str__(self):
        return f"Question #{self.id}"

class ShuffledQuestion(Question):
    class Meta:
        proxy = True
    
    @property
    def answers(self):
        _answers = list(super().answers)
        random.shuffle(_answers)
        return _answers

以及创建代理的位置:

_question_data = model_to_dict(question)
_question_data["quiz"] = question.quiz
_question_data["group"] = question.group
newQuestion = ShuffledQuestion(**_question_data)

上面的工作刚刚好,但我想知道是否有"更优雅"的方式来完成同样的事情。

ruarlubt

ruarlubt1#

你并不是真的将模型数据转换到它的代理模型中,因为代理模型和原始模型有相同的数据,它们毕竟在数据库中共享相同的表。
要将模型“强制转换”到它的代理中,您可以在代理模型查询集上使用get方法:

ShuufledQuestion.objects.get(pk=question.pk)

它将拥有与原始模型相同的数据,但Django方法/属性/管理器等不同。

相关问题