在 Django Model ViewSet 中实现多对多字段的搜索

在 web 开发中,能够高效地进行数据查询是一项基本的需求。对于使用 Django 和 Django Rest Framework (DRF) 的开发者来说,理解如何优雅地在 ViewSets 中实现多对多字段的搜索是一项必备技能。本文将详细探讨这一主题,提供丰富的示例和代码片段以帮助你更好地掌握这一技术。

初始设置

考虑以下的模型结构,其中我们有两个基本的模型:Author 和 Book,它们之间存在多对多的关系。

python 复制代码
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author, related_name='books')

Serializer 的配置

我们需要创建相应的 Serializer 来序列化这些模型。在 serializers.py 文件中:

python 复制代码
from rest_framework import serializers
from .models import Author, Book

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

class BookSerializer(serializers.ModelSerializer):
    authors = AuthorSerializer(many=True, read_only=True)

    class Meta:
        model = Book
        fields = '__all__'

ViewSet 的创建

views.py 文件中,我们创建一个 ViewSet 并添加 SearchFilter 用于实现搜索功能。

ini 复制代码
pythonCopy code
from rest_framework import viewsets, filters
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['title', 'authors__name']

在这个配置中,search_fields 属性允许我们定义想要进行搜索的字段。我们可以利用 Django 的双下划线(__)语法来搜索关联模型中的字段。

路由配置

接下来,在 urls.py 文件中,我们需要注册 ViewSet。

python 复制代码
from rest_framework.routers import DefaultRouter
from .views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet)

urlpatterns = [
    # ... 其他 URL 配置
    path('', include(router.urls)),
]

搜索功能

现在,通过访问以下 URL,你可以实现对书籍标题和作者名的搜索。

plaintext 复制代码
http://yourdomain.com/books/?search=substring

总结

通过这个详细的教程,我们学习了如何在 Django Model ViewSet 中实现多对多字段的搜索。这不仅增加了你的 Django Rest Framework 的技能,也帮助你更有效地处理复杂的查询需求。希望这篇文章能给你带来帮助,更深入地理解和掌握 Django 和 DRF 的强大功能。

相关推荐
Muyuan19986 小时前
27.RAG 系统中的上下文充分性判断:从 Chunk 数量、FAISS 距离到 LLM Relevance Gate
python·django·pdf·fastapi·faiss
程序媛徐师姐10 小时前
Python基于Django的小区果蔬预定系统【附源码、文档说明】
python·django·小区果蔬预定系统·果蔬预定·python小区果蔬预定系统·小区果蔬预定·python果蔬预定系统
码界筑梦坊1 天前
111-基于Python的中国旅游用户数据可视化分析系统
python·信息可视化·django·毕业设计·旅游
YJlio1 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
小熊Coding1 天前
懂车帝汽车销售数据可视化分析系统
python·信息可视化·django·汽车·数据可视化分析·懂车帝·汽车销售数据分析
ma_de_hao_mei_le2 天前
ntquerysystemiunfomation 数据传递
django
Muyuan19982 天前
22.让 RAG Agent 更像真实产品:聊天页面优化、PDF 上传、知识库重建与检索片段展示
python·django·pdf·fastapi
Muyuan19982 天前
25.Paper RAG Agent 优化记录:上传反馈、计算器安全与 Chunk 参数调整
python·安全·django·sqlite·fastapi
Muyuan19983 天前
26.Paper RAG Agent 展示面收口:截图与项目表达更新记录
人工智能·python·django·fastapi
毕胜客源码4 天前
卷积神经网络的手势识别系统(有技术文档)深度学习 图像识别 卷积神经网络 Django python 人工智能
人工智能·python·深度学习·cnn·django