首页 > 解决方案 > 如何使用扩展用户模型类实现 django admin 查询集过滤器

问题描述

我已经使用以下模型扩展了 Django 默认用户模型(只是为了保存用户 state_id)类。

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,)

    state_id = models.IntegerField(blank=False)

    def __str__(self):
       return self.user.username

现在我想按登录用户的state_id. 我试图实现查询集过滤器,但它什么也没做。

class VisVisitsAdmin(admin.ModelAdmin):

    list_per_page = 10
    list_display = ('visit_id','visit_no','user_name','mobile_number','program_name','state_name','district_name','block_name','school_name',)

    list_filter = ('date_of_visit',)

    def queryset(self, request):
        qs = super(VisVisitsAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(state_id=request.user.UserProfileInfo.state_id)

    def state_name(self, obj):
        if obj.school_program:
            return obj.school_program.school.cluster.block.district.state.name_of_state
    state_name.short_description = 'state name'    

标签: python-3.xdjango-admindjango-queryset

解决方案


您正在尝试从与用户对象相关的 userprofileinfo 实例中获取 state_id。

一切似乎都很好,但实例可用userprofileinfo和不可用UserProfileInfo,因此将 qs 更改为:

qs.filter(state_id=request.user.userprofileinfo.state_id)

推荐阅读