在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如何动态设置变量的名称,而不是变量内容。
答案 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))