【问题标题】:django admin list_filter foreign key subsetdjango admin list_filter 外键子集
【发布时间】:2012-02-19 05:37:57
【问题描述】:

我目前有一个这样的模型:

我有一个 Test 类,其中包含一个自定义 UserProfile 类的外键。此属性称为student。因此,每个 UserProfile 可能占用了多个 Test。然后,每个UserProfile 又通过典型的onetoone 关系绑定到User。因为我已经声明了两个用户组tutorsstudents,所以增加了另一个复杂程度。 UserProfile 类与其自身具有多对多关系,标记为“导师”。逻辑是每个学生可能有很多导师教他。现在我想做的是在测试管理页面的右侧添加过滤器,让您可以按学生过滤,也可以按导师过滤。设置list_filter = ('student',) 只是列出所有可用的用户配置文件。但这也包括与导师相关的 UserProfiles。显然,我想将这个列表过滤到只有学生,因为这些导师中的任何一个明确过滤都会导致一个空的查询集。然后我想通过导师过滤做类似的事情,在这种情况下,速记是list_filter = ('student__tutors'),但我希望这个 UserProfile 集被过滤掉,只包括那些 user_groups em>_name='导师'。最好的方法是什么?

为了清楚起见,我的对象模型如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True,related_name='profile')
    tutors = models.ManyToManyField("self",related_name="students")
class Test(models.Model):
    student = models.ForeignKey(UserProfile,related_name='tests')

我尝试使用以下方法对django.contrib.admin.SimpleListFilter 进行子类化:

class StudentListFilter(SimpleListFilter):
    title = 'student'
    parameter_name = 'student__id__exact'
    def lookups(self, request, model_admin):
        qs = model_admin.queryset(request)
        return User.objects.filter(profile__id__in=qs.values_list('student__id')).extra(select={'full_name':'first_name||" "||last_name'}).values_list('profile__id','full_name')

    def queryset(self, request, queryset):
        if self.value() is not None:
            return queryset.filter(student__id__exact=self.value())
        else:
            return queryset

这似乎适用于第一个 list_filter,但问题是由于某种原因,现在存在一个错误,即所选选项没有在自定义过滤器中突出显示。只有“全部”突出显示,而不是自定义选项。这是另一个用户发布的示例:

http://imgur.com/lyrYk

我目前正在使用 django 1.4 的开发版本,所以我不确定这个问题是否与此有关。

【问题讨论】:

    标签: django django-admin django-admin-filters


    【解决方案1】:

    有趣的问题。

    我认为您需要将 lookups 转换为字符串。

    return [(str(x), y) for x, y in your_valuesqueryset]
    

    django.admin.filters 的第 98 行将所选过滤器定义为:

    'selected': self.value() == lookup
    

    直接从lookups 方法的结果填充查找。

    filter() 调用中的自动类型强制使过滤器成功,但 '2' != 2

    【讨论】:

    • 非常感谢。我认为在没有列表理解的情况下,有知道在数据库级别上执行此操作的好方法吗?反正可能没关系
    • 正在考虑一个特定的 SQL 调用,我可以将其添加到 extra(select=) 字典中,以将 int 主键列转换为字符串。哦,好吧,它可能没有任何效率了
    猜你喜欢
    • 2020-09-20
    • 2012-03-30
    • 2012-04-06
    • 2015-01-08
    • 2016-06-02
    • 2015-03-16
    • 2012-10-18
    • 2018-06-25
    • 2011-01-16
    相关资源
    最近更新 更多