在我的代码中有一个地方,我需要重载模型的属性。为此,我使用了我的基本示例的代理模型。
型号:
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)
上面的工作刚刚好,但我想知道是否有"更优雅"的方式来完成同样的事情。
1条答案
按热度按时间ruarlubt1#
你并不是真的将模型数据转换到它的代理模型中,因为代理模型和原始模型有相同的数据,它们毕竟在数据库中共享相同的表。
要将模型“强制转换”到它的代理中,您可以在代理模型查询集上使用
get
方法:它将拥有与原始模型相同的数据,但Django方法/属性/管理器等不同。