Django 1.11 admin list_filter 在另一个模型中包含字段

Django 1.11 admin list_filter to include fields in another model

我有一个显示所有注册用户的 Django Admin class。我想在每个用户旁边添加一个显示他们最新响应的列(这是一个调查应用程序)。

到目前为止我尝试过的是:

响应模型

class Response(models.Model):

    """
        A Response object is a collection of questions and answers with a
        unique interview uuid.
    """

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    survey = models.ForeignKey(Survey, related_name="responses")
    user = models.ForeignKey(User, null=True, blank=True)
    interview_uuid = models.CharField(_(u"Interview unique identifier"),
                                      max_length=36)

    class Meta(object):
        verbose_name = _('response')
        verbose_name_plural = _('responses')

    def Quarter(self):
        msg = u"Q%d %d" %(((self.created.month-1)//3)+1, self.created.year)
        return msg

Admin.py

class ResponseAdmin(admin.ModelAdmin):
    list_display = ('survey', 'created', 'user', 'Quarter') **works here

class UserAdmin(admin.ModelAdmin):
    list_display = ('username', 'latest_response')
    list_filter = ('is_staff', 'latest_response')

    def latest_response(self, obj):
    (return "Quarter" from Response Model) **how do I get it to work here too?

admin.site.register(Response, ResponseAdmin)
admin.site.register(User, UserAdmin)

我的一些尝试导致了以下错误:

FieldError: Cannot resolve keyword 'Quarter' into field. Choices are: answers, created, id, interview_uuid, survey, survey_id, updated, user, user_id

所以我可以看出问题是 UserAdmin 出于某种原因没有从响应模型中获取 Quarter 字段。当我将 def Quarter(self) 更改为 __str__(self) 时,它在 UserAdmin 中显示为我想要的,但随后我过滤有问题。

在 ResponseAdmin class 下,Quarter 如我所愿。我如何在 UserAdmin 中也使用季度字段?

def latest_response(self, obj):
    latest_resp = (
        Response.objects
        .filter(user=obj)
        .order_by('-created')
        .first()
    )

    if latest_resp is not None:
        return latest_resp.Quarter()