Django:如何在models.Model子类中创建<classname> _set属性?

时间:2017-09-05 17:33:01

标签: python django

在Django中,我可以有一个模型问题和模型选择:

class Question(models.Model):
    ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    ...
    def __str__(self):
        return choice_text

我可以这样做:

>>>q = Question(question_text = 'How are you?', pub_date = timezone.now())
>>>q.choice_set.all()
<QuerySet []>

根据我的理解,q.choice_set访问我们数据库中的Choice个对象,这些对象通过其外键引用q

我的问题是:如何创建choice_set属性?我从未见过以小写字母表示另一个类名称的属性名称。这是如何实现的?

编辑:为了澄清,我问的是Django如何动态设置变量的名称,而不是变量内容。

1 个答案:

答案 0 :(得分:1)

名称由ForeignObjectRel.get_accessor_name决定。实际属性是通过setattr()中的RelatedField.contribute_to_related_class设置的。

基本上,当您创建ForeignKey的实例时会发生这种情况:

attribute_name = YourModel._meta.model_name + '_set'
setattr(foreign_key, attribute_name, SomeDescriptorClass(foreign_key))