问题描述
我有 3 个模型
class QuestionsModel(models.Model):
created = models.DateTimeField(auto_Now_add=True)
Question = models.CharField(max_length=200)
class AnswersModel(models.Model):
Question = models.ForeignKey(QuestionsModel,related_name='QuestionAnswer')
Answer = models.CharField(max_length=200)
class UsersAnswerModel(models.Model):
Answer = models.ForeignKey(AnswersModel,related_name='UsersAnswer')
RegistrationID = models.CharField(max_length=200)
我正在尝试计算有多少用户回答问题
我尝试了什么:
class DashboardAdmin(admin.ModelAdmin):
class Meta:
model = QuestionsModel
change_list_template = 'admin/Dashboard_change_list.html'
date_hierarchy = 'created'
def has_add_permission(self,request):
return False
def changelist_view(self,request,extra_context=None):
response = super().changelist_view(
request,extra_context=extra_context,)
try:
qs = response.context_data['cl'].queryset
except (AttributeError,KeyError):
return response
metrics = {
'totalAnswers' : models.Count('QuestionAnswer'),'totalUsersAnswer' : models.Count(UsersAnswer=OuterRef('QuestionAnswer'))
}
response.context_data['summary'] = list(
qs
.values('Question')
.annotate(**metrics)
.order_by('-totalUsersAnswer')
)
return response
admin.site.register(DashboardModel,DashboardAdmin)
我无法解决
'totalUsersAnswer' : models.Count(UsersAnswer=OuterRef('QuestionAnswer'))
如何计算嵌套的外键
请帮忙
解决方法
class AnswersModel(models.Model):
Question = models.ForeignKey(QuestionsModel,related_name='QuestionAnswer')
Answer = models.CharField(max_length=200)
class UsersAnswerModel(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT)
Answer = models.ForeignKey(AnswersModel,related_name='UsersAnswer')
RegistrationID = models.CharField(max_length=200)
Q- 有多少用户回答了一个问题? 例如
user_answer = UsersAnswerModel.objects.filter(Answer__question__id=2).count()
You can now annotate based on your need.
您的模型需要重命名
-
AnswersModel 简单地回答
-
UsersAnswerModel 到 UserAnswer,应该有一个用户实体作为我上面所做的字段。
3.模型中的字段名最好小写。
,我已经通过添加 QuestionAnswer__UsersAnswer 来解决它
metrics = {
'totalAnswers' : models.Count('QuestionAnswer',distinct=True),'totalUsersAnswer' : models.Count('QuestionAnswer__UsersAnswer'),}