使用django-filter通过ForeignKey进行过滤

问题描述 投票:0回答:1

我有两个模型的用户和属性,每个用户都有多个属性

class User(models.Model):
    userid =  models.CharField(max_length=200, primary_key=True)
    name =   models.CharField(max_length=200)
    email =   models.CharField(max_length=200)
    def __str__(self):
       return self.userid

class Attribute(models.Model):
    userid = models.ForeignKey(User,on_delete=models.CASCADE)
    rolechoice = (('admin','admin'),('visitor','visitor'),('customer','customer'),('user','user'))
    type =   models.CharField(max_length=15,choices = rolechoice)
    value =   models.CharField(max_length=200)
    def __str__(self):
        return str(self.value)

我可以在用户页面中按名称,ID,电子邮件进行过滤,但是要按我不知道的Attribute类中存在的角色进行过滤。

这是我的观点:

def users_search(request):
    user_list = User.objects.all()
    user_filter = UserFilter(request.GET, queryset=user_list)
    return render(request, 'cocadmin/users_stream.html', {'filter': user_filter})

这是我的filter.py

class UserFilter(django_filters.FilterSet):
    userid = django_filters.CharFilter(lookup_expr='icontains')
    name = django_filters.CharFilter(lookup_expr='icontains')
    email = django_filters.CharFilter(lookup_expr='icontains')
    attributes = django_filters.ModelChoiceFilter(queryset=Attribute.objects.all())
    class Meta:
        model = User
        fields = ['userid','name','email','attributes']

感谢您的帮助:)

django django-2.0 django-filters
1个回答
0
投票

您可以使用双下划线访问type属性:

class UserFilter(django_filters.FilterSet):
    type = django_filters.ChoiceFilter(
        field_name='attribute__type', choices=Attribute.rolechoice
    )
    ...

如您所见,此语法类似于Django的ORM语法。如果要更改字段的标签,可以使用附加的label参数来完成:

    type = django_filters.ChoiceFilter(
        field_name='attribute__type', choices=Attribute.rolechoice, label='User role'
    )

the docs中的更多ChoiceField详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.