我有两个模型的用户和属性,每个用户都有多个属性
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']
感谢您的帮助:)
您可以使用双下划线访问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详细信息。