Django REST API实现按商品名称而非ID查询库存数据的问题
方案2:使用Slug字段(URL友好方案)
如果商品名称包含空格、特殊字符,直接用在URL中不够规范,推荐使用Slug字段生成URL友好的字符串:
- 修改models.py,添加
slug字段并自动生成:
from django.db import models from django.utils.text import slugify class Stock(models.Model): name = models.CharField(max_length=50, unique=True) slug = models.SlugField(max_length=50, unique=True, blank=True) # 添加slug字段 stock_number = models.IntegerField('Number of Stocks') price = models.DecimalField(max_digits=6, decimal_places=2) def save(self, *args, **kwargs): # 自动从name生成slug(如"Apple iPhone"转为"apple-iphone") if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) def __str__(self): return self.name
执行数据库迁移:
python manage.py makemigrations python manage.py migrate
- 修改views.py,指定查询字段为
slug:
class StockDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Stock.objects.all() serializer_class = StockSerializer lookup_field = 'slug' # 指定用slug字段查询
- 修改urls.py,使用
slug类型的URL参数:
urlpatterns = [ path('<slug:slug>/', StockDetail.as_view()), path('', StockList.as_view()), ]
- 可选:更新serializers.py,把slug字段加入返回结果:
from rest_framework import serializers from .models import Stock class StockSerializer(serializers.ModelSerializer): class Meta: fields = ('id', 'name', 'slug', 'stock_number', 'price') model = Stock
现在你可以通过/api/apple-iphone/这类格式访问数据,更符合URL设计规范。
你之前的错误说明
- 仅修改URL参数但未设置
lookup_field:DRF通用视图默认使用pk作为查询字段,必须在视图中显式指定要使用的模型字段(lookup_field = 'name',注意是单数形式)。 - 使用错误的属性名
lookup_fields:正确的属性是lookup_field(单数),且视图不需要class Meta(这是模型和序列化器的配置方式)。
内容的提问来源于stack exchange,提问作者esabo
相关产品推荐
相关产品推荐

