filter_fields的作用
时间: 2024-04-19 10:26:21 浏览: 19
`filter_fields`是Django REST framework中用于过滤查询结果的一个属性。它用于定义哪些字段可以用于过滤查询结果。
当你使用Django REST framework构建API时,你可以使用`filter_fields`属性来指定哪些字段可以用于过滤查询结果。这个属性通常与`django_filters`库一起使用,以提供灵活的过滤功能。
通过指定`filter_fields`属性,你可以允许客户端在API请求中使用特定字段进行过滤。这样,客户端可以根据其需求仅获取符合特定条件的数据。
例如,如果你在一个电影API中有一个`Movie`模型,其中有`title`、`genre`和`release_date`等字段,你可以将`filter_fields`属性设置为`['title', 'genre', 'release_date']`。这样,客户端就可以通过在API请求中提供相应的参数来过滤电影列表,例如通过标题、流派或发布日期来获取特定的电影。
总之,`filter_fields`属性允许你定义可用于过滤查询结果的字段,提供了方便的过滤功能,使得API更加灵活和易用。
相关问题
filter_backends
filter_backends是Django REST Framework中的一个概念。它用于定义API视图中用于过滤和排序结果集的后端列表。
在Django REST Framework中,当你想要对API的查询结果进行过滤或排序时,你可以通过定义filter_backends属性来指定所需的后端类。这些后端类将按照它们在列表中的顺序应用于视图,以便对结果集进行相应的处理。
常见的filter_backends后端类包括:
- DjangoFilterBackend:使用Django内置的过滤器进行过滤。
- SearchFilter:使用搜索字段对结果进行搜索。
- OrderingFilter:按照指定的字段对结果进行排序。
例如,你可以这样定义一个视图类,并指定filter_backends属性:
```python
from rest_framework import filters
class MyView(APIView):
filter_backends = [filters.DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['name']
search_fields = ['name', 'description']
def get(self, request):
queryset = MyModel.objects.all()
queryset = self.filter_queryset(queryset)
# 继续处理查询结果...
```
在上面的例子中,我们使用了DjangoFilterBackend和SearchFilter后端类来实现过滤和搜索功能。`filterset_fields`属性指定了可以用于过滤的字段,而`search_fields`属性指定了可以用于搜索的字段。
当请求到达这个视图时,Django REST Framework会按照指定的顺序依次应用这些后端类,以对查询结果进行过滤和排序。
class StaffInfoAdmin(admin.ModelAdmin): inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline] search_fields = ['NAME', 'RES_ID'] list_display = ['NAME', 'BIRTH', 'RES_ID'] list_filter = ['POST'] def clean_fields(self, request, obj): mobile_pattern = re.compile(r'^1[3456789]\d{9}$') if not re.match(mobile_pattern, obj.TEL): raise ValidationError("请输入11位电话号码,且不包含'-'") super().clean_fields(request, obj)代码如上,但是没有完成合法性检查的功能,电话号码输入123依旧可以提交数据
根据你提供的代码,可以看出在`clean_fields`函数中进行了电话号码的合法性检查,但是这个函数并没有被调用。为了实现这个功能,你需要在`save_model`函数中手动调用`clean_fields`函数。修改后的代码如下:
```
class StaffInfoAdmin(admin.ModelAdmin):
inlines = [EmergencyInline, BackgroundInline, WorkInline, FamilyInline]
search_fields = ['NAME', 'RES_ID']
list_display = ['NAME', 'BIRTH', 'RES_ID']
list_filter = ['POST']
def clean_fields(self, request, obj):
mobile_pattern = re.compile(r'^1[3456789]\d{9}$')
if not re.match(mobile_pattern, obj.TEL):
raise ValidationError("请输入11位电话号码,且不包含'-'")
super().clean_fields(request, obj)
def save_model(self, request, obj, form, change):
self.clean_fields(request, obj)
super().save_model(request, obj, form, change)
```
这样就可以在保存数据之前进行合法性检查了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)