Django官方教程模型第4部分

时间:2018-06-20 08:11:50

标签: python django forms web models

您好,我在djangoproject官方教程的第4部分中使用question.choice_set陈述,我不知道choice_set是什么意思,有人可以帮助我吗?

我可以使用例如question.Objects代替question.choice_set吗? 谢谢

2 个答案:

答案 0 :(得分:3)

如果您将ForeignKeyChoiceQuestion,例如:

class Choice(models.Model):
    # ...
    question = models.ForeignKey(Question, on_delete=models.CASCADE)

然后Django 自动创建相反的关系。默认情况下,该关系的名称为nameofmodel_set

由于相同 Choice上可以映射多个Question对象,因此这是一个集合(可以包含零个,一个或多个对象的集合)

因此,通过使用somequestion.choice_set,您将得到一个ObjectManager,它处理特定于 Choice实例的所有Question对象(此处是somequestion

然后,您可以在该集合上使用.filter(..),或.update(..)或编写自定义ORM查询。因此,例如somequestion.choice_set.all()会给您 all 所有相关的Choice

有时这种反向关系的名称不是很好,在这种情况下,您可以使用reated_name参数来给它起另一个名字,例如:

class Choice(models.Model):
    # ...
    question = models.ForeignKey(Question,
                                 on_delete=models.CASCADE,
                                 related_name='options')

如果您不想要这种反向关系(例如,因为它会引起很多混乱),则可以将'+'用作related_name

class Choice(models.Model):
    # ...
    # no opposite relation
    question = models.ForeignKey(Question,
                                 on_delete=models.CASCADE,
                                 related_name='+')

答案 1 :(得分:1)

class UniformRowHeights(QTableView): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._row_height = None def sizeHintForRow(self, row): model = self.model() if row < 0 or row >= model.rowCount(): # Mirror super implementation. return -1 return self.get_row_height() def get_row_height(self): if self._row_height is None: self._row_height = max(self._get_cell_heights()) return self._row_height def changeEvent(self, event): # This for instance happens when the style sheet changed. It may affect # the calculated row height. So invalidate: self._row_height = None super().changeEvent(event) def _get_cell_heights(self, row=0): self.ensurePolished() option = self.viewOptions() model = self.model() for column in range(model.columnCount()): index = model.index(row, column) delegate = self.itemDelegate(index) if delegate: yield delegate.sizeHint(option, index).height() 是默认属性名称,通过它可以访问反向相关的对象。因此,您的模型如下:

modelname_set

因此,如果您想获得与特定问题相关的所有选择,则可以使用followng语法:

class Question(Model):
    ...

class Choice(Model):
    question = ForeignKey(Question)
    ...

您可以使用related_name参数将属性名称更改为更易于理解的名称:

question.choice_set.all()

在这种情况下,您现在可以使用class Choice(Model): question = ForeignKey(Question, related_name='choices') 来获取问题的选择。