3

我想通过模型中的函数过滤查询集。

class CommentAdmin(admin.ModelAdmin):

    class PostedByGuestFilter(admin.SimpleListFilter):

        title = 'Posted by Guest'
        parameter_name = 'posted_by_guest'

        def lookups(self, request, model_admin):
            return (
                (True, 'Yes'),
                (False, 'No'),
            )

        def queryset(self, request, queryset):
            if self.value():
                return [comment for comment in queryset if comment.posted_by_guest()]
            elif not self.value():
                return [comment for comment in queryset if not comment.posted_by_guest()]

不幸的是,这种实施导致django.admin告诉我我的数据库已损坏。我该如何解决这个问题?

在此处输入图像描述

4

2 回答 2

3

它不是最佳的(将导致额外的 SQL 查询),comment.posted_by_guest()如果可能的话,我会寻找将逻辑移动到 SQL 中的方法(如果您需要帮助,请显示该方法的主体),但这应该工作:

def queryset(self, request, queryset):
    expected_value = self.value()
    excludes = []
    for comment in queryset:
        if comment.posted_by_guest() != expected_value:
            excludes.append(comment.id)
    return queryset.exclude(pk__in=excludes)

Django 管理过滤器 API 可以做一些改进!

于 2013-08-22T00:03:52.180 回答
2

这里的问题是 Django 需要一个查询集,而您的代码提供了一个列表。您可以通过将理解包装在一组中来解决此问题:

    def queryset(self, request, queryset):
        if self.value():
            return set(comment for comment in queryset if comment.posted_by_guest())
        elif not self.value():
            return set(comment for comment in queryset if not comment.posted_by_guest())
于 2012-09-28T22:07:08.933 回答