django 一对多关系结果查询
2017-09-13 本文已影响85人
amyhy
我先定义两个模型,一个是问题,一个是选项,一个问题可以有多个选项。一对多的类型。
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Meta:
db_table = 'question'
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
class Meta:
db_table = 'choice'
def __str__(self):
return self.choice_text
我们要查询某个问题下有哪些选项可以用
先查询到问题的信息
question = get_object_or_404(Question, 筛选条件)
返回一个question对象
接下来就查询question关联的所有选项对象
choice = question.choice_set.all()
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。
这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。
如果你觉得上面的定义比较麻烦的话,你也可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如:
question = models.ForeignKey(Question, related_name='question_set')
那么上面的话:choice = question.choice_set.all()
也可以用choice = question.question_set.all()
上面的是查询是通过主表来查询子表的信。
下面我简单的说下通过子表来查询主表的信息。
假设需要查询一个选项对应的的信息,那我可以通过下面的步骤来实现:
假如我先得到了一个子表的对象。那我只要获取该对象关联主表的外键的熟悉,就可以得到主表的信息了。
比如得到一个choice对象,然后我想得到choice对象的主表question的信息的话:
p =choice.question