class Answer(models.Model):
question = models.ForeignKey(Question)
answer = models.CharField(max_length=30)
class Response(models.Model):
answer = models.ForeignKey(Answer)
user = models.ForeignKey(User)
time = models.DateTimeField(auto_now_add=True)
class Profile(models.Model):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
user = models.OneToOneField("auth.User")
age = models.IntegerField(max_length=2)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
zipcode = models.IntegerField(max_length=5)
state = models.CharField(max_length=15)
我有一个响应模型,它是每个用户的问题和个人资料模型的答案,并且想知道如何进行查询以获取每个用户答案的列表(它们对于每个用户的每个问题都是唯一的)和他们的个人资料。最后我想说的是,有多少比例的男性回答了一种方式,另外一种方式如何投票,等等。我能够查询每个问题投票的用户百分比,但还未能将其分解得更远。我如何进行查询以找到每个性别投票的答案的百分比?
如果我可以加入User上的Profile和Response表,我就可以制作一个numpy数组并对其进行分析,我认为这也很有帮助。
答案 0 :(得分:3)
当任何模型具有models.ForeignKey
字段时,Django提供便利方法。有关详细信息,请参阅Many-To-One Relationships。查看此示例以查找what percentage of an answer each gender voted for?
特定Answer
为answer
:
>>> answer.response_set.filter(user__profile__gender='M')
[<Repsonse 1>, <Repsonse 2>, <Repsonse 3>, ... ]
这将为您提供回答用户为男性的所有回复。
如果您只想知道统计信息而不关心返回的实际Response对象,您只需使用.count()
方法,如下所示:
>>> queryset = answer.response_set.all()
>>> total_responses_for_answer = queryset.count()
>>> number_of_males = queryset.filter(user__profile__gender='M').count()
>>> print 'Percent', (number_of_males / float(total_responses_for_answer)) * 100
98.1
让我试着解释发生了什么。
当model B
的{{1}}字段指向models.ForeignKey
时,Django使用model A
关键字参数在related_name
上创建一个特殊方法, model A
中指向model B
实例的关系。
如果未指定model A
关键字,Django会将方法名称默认为related_name
。
在这种情况下,<relationship>_set
模型上的answer
字段未指定Response
关键字参数,因此Django将方便方法related_name
添加到response_set
1}}模型。
要查看选择Answer
的所有Responses
,请使用简单查询:
answer
如果您愿意,可以指定>>> answer.response_set.all()
来创建自己的关系方法。例如:
related_name
发生的第二点魔法就是你正在寻找的class Response(models.Model):
...
answer = models.ForeignKey(Answer, related_name='responses')
...
# and use the custom method name like so:
>>> answer = Answer.objects.get(pk=pk)
>>> answer.responses.all()
。 JOINs
返回response_set
个对象的查询集。 Response
模型有一个名为Response
的字段。 user
模型通过Profile
字段User
与models.OneToOne
建立了关联,而user
模型也包含该用户的性别(以及其他有趣的内容)。花哨的双下划线部分Profile
只是说:
查找所有响应实例 WHERE 响应的用户的__个人资料的__性别等于'M'