在 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 的强大功能。

相关推荐
qq_22589174668 小时前
基于Python的城市内涝积涝监测数据可视化分析系统
后端·python·信息可视化·数据分析·django
米码收割机8 小时前
【Python】Python Django+Vue3校园自习室预约管理系统(源码+文档+PPT)【独一无二】
开发语言·python·django
米码收割机10 小时前
【移动】线上购物移动端网站(源码+文档)【独一无二】
java·开发语言·前端·python·django
weixin_BYSJ19871 天前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
智购科技自动售货机工厂1 天前
即时零售的风吹到自动售货机行业,会带来什么变化?~YH
大数据·人工智能·django·fastapi·零售·tornado
想你依然心痛1 天前
预测未来用电趋势,机器学习算法在能耗管理中的落地
随机森林·django·数据清洗·特征工程·电力负荷预测·时序数据·能耗管理
倒流时光三十年2 天前
第一阶段 02 · Mapping 与数据类型(text vs keyword 是重点)
后端·python·django
weixin_BYSJ19873 天前
springboot3家政平台小程序--附源码00904
java·javascript·spring boot·python·django·flask·php
米码收割机4 天前
【Python】Django 电子设备商城系统(源码+说明文档)[独一无二]
开发语言·python·django
dNGUZ7UGj5 天前
10分钟完成第一个Python小游戏
python·django