首页 > 解决方案 > 在 Django Admin 中显示我的模型数据的子集

问题描述

我的数据库模型就像

class Restaurant(models.Model):
    email_sent = models.BooleanField(null=True, default=False)
    rest_owner = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='rest_owner')
    is_approved = models.BooleanField(null=False, default=False)

我想创建一个单独的表,我可以在其中显示is_approved=0的字段的数据。它在 django 站点中很简单。但我无法在 djangoAdmin 方面找到这样做的方法。或者我必须为此创建一个自定义管理员?

标签: djangodjango-modelsdjango-admin

解决方案


您可以创建一个代理模型,然后稍微更新查询集以满足您的要求。

class UnapprovedRestaurant(Restaurant):
    class Meta:
        proxy=True

class UbapprovedRestaurantAdmin(admin.ModelAdmin):
    def get_queryset(self, *args, **kwargs):
        return Restaurant.objects.filter(is_approved=False)

admin.site.register(UnapprovedRestaurant, UbapprovedRestaurantAdmin)

如果您不想为这两种状态分开您的管理页面。然后我更喜欢您为管理页面创建一个自定义过滤器,以便您可以根据定义的条件过滤数据,如下所示:

class RestaurantFilter(admin.SimpleListFilter):

    def lookups(self, request, model_admin):
        return (
            'approved': 'Approved',
            'unapproved': 'Unapproved'
        )

    def queryset(self, request, queryset):
        value = self.value()
        if value is None:
            return queryset
        elif value == 'approved':
            return queryset.filter(is_approved=True)
        elif value == 'unapproved':
            return queryset.filter(is_approved=False)

class RestaurantAdmin(admin.ModelAdmin):
    list_filter = (RestaurantFilter, )

admin.site.register(Restaurant, RestaurantAdmin)

推荐阅读