【问题标题】:Django Nested AnnotateDjango 嵌套注释
【发布时间】:2021-02-22 03:12:35
【问题描述】:

我有 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'))

如何计算嵌套外键

请帮忙

【问题讨论】:

    标签: sql django django-models django-rest-framework django-annotate


    【解决方案1】:
    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.模型中的字段名最好小写。

    【讨论】:

    • 我收到此错误“相关字段查找无效:​​问题”
    • @BoSoud-你能分享一下你正在做的查询吗?
    • 我只是修改了这行 ``` user_answer = UsersAnswerModel.objects.filter(Answer__question__id=20).count() metrics = { 'totalAnswers' : models.Count('QuestionAnswer'), ' totalUsersAnswer' : user_answer } response.context_data['summary'] = list(qs .values('Question') .annotate(**metrics) .order_by('-totalUsersAnswer') ) 返回响应```
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2019-03-11
      • 2013-08-11
      • 2012-01-17
      • 2011-06-04
      • 1970-01-01
      • 2013-04-26
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多