基于Qwen2.5-Coder-1.5B的Web开发:Django REST框架
基于Qwen2.5-Coder-1.5B的Web开发:Django REST框架
如果你是一位Web开发者,尤其是后端方向的,肯定对Django不陌生。这个框架功能强大,但有时候,构建一个完整的REST API,从模型设计到视图编写,再到序列化器和权限控制,整个过程还是挺繁琐的。特别是当你需要快速验证一个想法,或者项目初期需要搭建基础框架时,重复性的代码工作会占用不少时间。
最近我尝试用Qwen2.5-Coder-1.5B来辅助开发一个Django REST项目,效果让我有点意外。这个专门为代码生成优化的模型,在理解Django框架结构和生成符合规范的代码方面,表现得相当不错。它不仅能帮你生成基础的CRUD代码,还能理解一些更复杂的需求,比如权限控制和缓存集成。
这篇文章,我就来分享一下如何用这个模型来加速你的Django REST API开发,从零开始构建一个具备基础功能的项目,并加入一些实用的进阶特性。
1. 场景与目标:我们要解决什么问题?
假设我们正在开发一个简单的任务管理API。这个API需要管理用户的任务,每个任务有标题、描述、状态、创建时间等属性。我们需要实现以下功能:
- 基本的CRUD操作:用户可以创建、查看、更新、删除自己的任务。
- 权限控制:用户只能操作自己的任务,不能查看或修改别人的。
- 数据过滤与搜索:可以根据任务状态或标题关键词来筛选任务。
- 性能考虑:为频繁访问的API端点(如任务列表)添加缓存,减少数据库压力。
传统上,我们需要手动编写models.py、serializers.py、views.py,配置urls.py,并设置权限类和缓存逻辑。现在,我们可以让Qwen2.5-Coder-1.5B来承担大部分代码生成的工作。
2. 环境准备与模型调用
首先,你需要一个能运行Qwen2.5-Coder-1.5B的环境。这里假设你已经通过Hugging Face Transformers或类似的本地部署方式准备好了模型。我们使用其Instruct版本,因为它对指令的理解更好。
下面是一个基础的Python脚本,用于加载模型并与它进行“对话”,让它为我们生成代码。
# generate_django_code.py
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
def ask_qwen(prompt):
"""
向Qwen2.5-Coder-1.5B-Instruct模型提问并获取代码回答。
"""
model_name = "Qwen/Qwen2.5-Coder-1.5B-Instruct"
# 加载模型和分词器(建议根据你的硬件调整device_map)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto",
trust_remote_code=True
)
# 构建对话消息
messages = [
{"role": "system", "content": "你是一个专业的Python和Django开发助手。请生成准确、符合最佳实践的代码。"},
{"role": "user", "content": prompt}
]
# 应用聊天模板并生成
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
generated_ids = model.generate(
**inputs,
max_new_tokens=1024, # 生成代码可能需要较长的token
temperature=0.2, # 降低随机性,让代码更确定
do_sample=True,
)
# 解码并提取助手回复(跳过输入部分)
response_ids = generated_ids[0][inputs.input_ids.shape[-1]:]
response = tokenizer.decode(response_ids, skip_special_tokens=True)
return response
# 示例:让模型生成一个Django模型
if __name__ == "__main__":
prompt = """
请为Django创建一个Task模型,包含以下字段:
1. title: CharField,最大长度200,不能为空。
2. description: TextField,可以为空。
3. status: CharField,最大长度20,选择有:'pending', 'in_progress', 'completed',默认是'pending'。
4. created_at: DateTimeField,自动设置为创建时间。
5. updated_at: DateTimeField,自动设置为最后修改时间。
6. owner: ForeignKey,关联到Django内置的User模型,表示任务的所有者。
请包含必要的导入和Meta类。
"""
generated_code = ask_qwen(prompt)
print("生成的模型代码:")
print(generated_code)
运行这个脚本,你应该能得到一段结构清晰的Django模型代码。这就是我们合作的开始。
3. 分步构建Django REST API
接下来,我们将分模块,通过向模型提供清晰的指令,来构建完整的API。
3.1 生成数据模型 (models.py)
我们从一个具体的需求开始。将上面main函数中的prompt提交给模型,它会生成类似下面的代码:
# tasks/models.py
from django.db import models
from django.contrib.auth.models import User
class Task(models.Model):
STATUS_CHOICES = [
('pending', 'Pending'),
('in_progress', 'In Progress'),
('completed', 'Completed'),
]
title = models.CharField(max_length=200)
description = models.TextField(blank=True, null=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='tasks')
class Meta:
ordering = ['-created_at'] # 默认按创建时间倒序排列
def __str__(self):
return self.title
模型准确地理解了字段类型、参数(如blank=True, null=True)、外键关系以及Meta选项。related_name的设置也很贴心。
3.2 生成序列化器 (serializers.py)
有了模型,下一步是创建序列化器,用于将模型实例转换为JSON,以及验证传入的数据。
# 新的prompt
prompt_serializer = """
基于上面生成的Task模型,请创建一个Django REST Framework的ModelSerializer。
这个序列化器应该:
1. 包含所有模型字段。
2. 将`owner`字段设置为只读(read_only),因为所有者应该从请求的用户中自动获取。
3. 确保`created_at`和`updated_at`也是只读的。
请给出完整的序列化器类代码。
"""
将这段prompt通过我们的ask_qwen函数发送,会得到类似下面的输出:
# tasks/serializers.py
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username') # 可选,显示用户名而非ID
class Meta:
model = Task
fields = ['id', 'title', 'description', 'status', 'created_at', 'updated_at', 'owner']
read_only_fields = ['id', 'created_at', 'updated_at', 'owner'] # 明确指定只读字段
模型不仅生成了基础序列化器,还提供了一个小优化:将owner字段显示为用户名,这比单纯的ID对前端更友好。同时,它正确地设置了read_only_fields。
3.3 生成视图集 (views.py) 与权限控制
这是核心部分。我们需要视图来处理HTTP请求,并实现“用户只能操作自己任务”的权限。
# 新的prompt
prompt_view = """
请创建一个Django REST Framework的ModelViewSet,用于处理Task模型。
要求:
1. 使用上面定义的TaskSerializer。
2. 实现权限控制:只有认证用户才能访问,并且用户只能查看和修改自己的任务(IsOwner权限)。
3. 添加过滤功能:允许通过查询参数`status`和`search`(在title和description中搜索)来过滤任务列表。
4. 重写`perform_create`方法,在创建新任务时自动将当前登录用户设置为任务所有者。
请提供完整的视图集代码,包括必要的导入。
"""
模型的生成结果通常会包含以下几个关键部分:
# tasks/views.py
from rest_framework import viewsets, permissions, filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import Task
from .serializers import TaskSerializer
class IsOwner(permissions.BasePermission):
"""
自定义权限:只允许对象的所有者对其进行操作。
"""
def has_object_permission(self, request, view, obj):
# 读取权限允许任何请求(GET, HEAD, OPTIONS)
if request.method in permissions.SAFE_METHODS:
return True
# 写入权限只允许对象的所有者
return obj.owner == request.user
class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = [permissions.IsAuthenticated, IsOwner] # 组合权限
# 配置过滤和搜索
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['status']
search_fields = ['title', 'description']
def get_queryset(self):
"""
确保用户只能看到自己的任务。
"""
user = self.request.user
return Task.objects.filter(owner=user).order_by('-created_at')
def perform_create(self, serializer):
"""
创建任务时,自动设置所有者。
"""
serializer.save(owner=self.request.user)
视图集代码非常完整。它创建了一个自定义的IsOwner权限类,正确配置了过滤后端(这里提示需要安装django-filter包),并重写了get_queryset和perform_create方法,完美实现了我们的业务逻辑和安全要求。
3.4 生成URL配置 (urls.py) 与缓存集成
最后,我们需要注册路由,并为任务列表视图添加缓存。
# 新的prompt
prompt_url_cache = """
1. 为上面的TaskViewSet生成Django REST Framework的router配置,并包含在项目的urlpatterns中。
2. 同时,请展示如何为TaskViewSet的`list`动作(获取任务列表)添加缓存。使用Django的缓存框架,缓存时间为5分钟。
请提供`tasks/urls.py`和视图集中关于缓存的修改部分。
"""
模型可能会分两部分回答。首先是URL配置:
# tasks/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet
router = DefaultRouter()
router.register(r'tasks', TaskViewSet, basename='task')
urlpatterns = [
path('', include(router.urls)),
]
然后是缓存的集成。模型可能会建议使用drf-extensions库(这是一个常见选择),或者直接使用Django的缓存API装饰器。这里展示一种使用drf-extensions的方式:
# 首先需要安装:pip install drf-extensions
# tasks/views.py (修改部分)
from rest_framework_extensions.cache.mixins import CacheResponseMixin
class TaskViewSet(CacheResponseMixin, viewsets.ModelViewSet): # 通过混入添加缓存
# ... 其他代码保持不变 ...
cache_response_timeout = 300 # 缓存5分钟(300秒)
或者,模型也可能生成使用@method_decorator配合Django原生缓存装饰器的代码。无论哪种方式,它都给出了可行的解决方案。
4. 实际效果与体验
把上面生成的代码片段整合到一个Django项目中,经过简单的配置(安装依赖、迁移数据库、创建超级用户),一个具备基础功能、权限控制和缓存的任务管理API就搭建完成了。
我用它快速测试了一下:
- 生成代码质量:大部分代码可以直接使用或稍作微调。模型对Django REST Framework的API非常熟悉,生成的代码符合规范。
- 理解复杂需求:对于“用户只能操作自己任务”这种业务逻辑,模型能准确翻译成自定义权限和过滤查询集,这是让我比较惊喜的。
- 上下文关联:在后续的prompt中,提到“上面的Task模型”或“之前的序列化器”,模型能很好地保持上下文一致性。
- 效率提升:手动编写这些文件,即使对熟练开发者,也需要半小时到一小时。利用模型生成,并将时间花在审核和微调上,整个过程可以缩短到10-15分钟。
当然,它并非完美。有时生成的代码可能需要你调整导入语句,或者缓存方案需要你根据项目实际情况选择。但它极大地减少了初始搭建的机械劳动,让你能更专注于核心业务逻辑和架构设计。
5. 更多应用场景与建议
基于这次实践,我觉得Qwen2.5-Coder-1.5B在Web开发中还有更多用武之地:
- 生成测试代码:可以为刚写好的视图或序列化器生成单元测试。
- 生成API文档:根据序列化器和视图集,快速生成OpenAPI/Swagger文档的配置片段。
- 生成表单或前端组件:如果你在使用Django模板或需要与前端框架(如Vue/React)对接,可以让它生成对应的表单结构或API调用示例。
- 代码解释与重构:将一段复杂的旧代码丢给它,让它添加注释或建议重构方案。
给想尝试的朋友几点建议:
- Prompt要具体:像布置任务一样,越详细越好。说明框架、版本、具体字段和业务规则。
- 分而治之:不要试图用一个prompt生成整个项目。像本文这样,按模块(模型、序列化器、视图、路由)逐个生成,成功率和可控性更高。
- 做好代码审查:始终把模型当作一个强大的助手,而不是替代品。生成的代码一定要自己阅读理解、测试后再使用。
- 结合官方文档:对于模型生成的缓存、过滤等涉及第三方库的方案,最好去查阅一下对应库的官方文档,确认用法和版本兼容性。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐

所有评论(0)