您好,我在djangoproject官方教程的第4部分中使用question.choice_set
陈述,我不知道choice_set
是什么意思,有人可以帮助我吗?
我可以使用例如question.Objects代替question.choice_set
吗?
谢谢
答案 0 :(得分:3)
如果您将ForeignKey
从Choice
到Question
,例如:
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')
来获取问题的选择。