Django 嵌套注释

Django Nested Annotate

我有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.

您的模型需要重命名

  1. AnswersModel 简单回答

  2. UsersAnswerModel 到 UserAnswer,应该有一个用户实体作为字段,就像我在上面所做的那样。

3.Fieldnames 模型中的小写更好。

我已经通过添加 QuestionAnswer__UsersAnswer

解决了
metrics = {
        'totalAnswers' : models.Count('QuestionAnswer', distinct=True),
        'totalUsersAnswer' : models.Count('QuestionAnswer__UsersAnswer'),
    }