Django 嵌套注释

问题描述

我有 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.模型中的字段名最好小写。

,

我已经通过添加 QuestionAnswer__UsersAnswer 来解决它

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