You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST API实现按商品名称而非ID查询库存数据的问题

方案2:使用Slug字段(URL友好方案)

如果商品名称包含空格、特殊字符,直接用在URL中不够规范,推荐使用Slug字段生成URL友好的字符串:

  1. 修改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
  1. 修改views.py,指定查询字段为slug:
class StockDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Stock.objects.all()
    serializer_class = StockSerializer
    lookup_field = 'slug'  # 指定用slug字段查询
  1. 修改urls.py,使用slug类型的URL参数:
urlpatterns = [
    path('<slug:slug>/', StockDetail.as_view()),
    path('', StockList.as_view()),
]
  1. 可选:更新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设计规范。


你之前的错误说明

  1. 仅修改URL参数但未设置lookup_field:DRF通用视图默认使用pk作为查询字段,必须在视图中显式指定要使用的模型字段(lookup_field = 'name',注意是单数形式)。
  2. 使用错误的属性名lookup_fields:正确的属性是lookup_field(单数),且视图不需要class Meta(这是模型和序列化器的配置方式)。

内容的提问来源于stack exchange,提问作者esabo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:01:06