Django中为每个UUID生成唯一链接报错:无法解析slug字段
解决Django中UUID查询的FieldError问题
问题根源
- 字段不存在:
Get_Customer_ID模型里没有定义slug字段,但视图代码中用了get(slug=uid)进行查询,导致Django无法识别该字段。 - 查询语法错误:
get(slug=uid) or id=uid是错误写法,Django的get()方法不支持这种逻辑判断,必须明确指定正确的查询字段。 - 模型与数据库不匹配:
Get_Customer_ID未显式定义UUID主键,Django默认会生成自增id字段,和数据库中UUID作为主键的结构冲突。 - URL参数不匹配:URL路径定义了
<str:id>和<slug:uid>两个参数,但视图函数只接收uid,参数数量不对应。
修复步骤
1. 修正模型定义
显式声明Get_Customer_ID的主键为UUID字段,和数据库结构对齐:
import uuid from django.db import models class Product(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) class Get_Customer_ID(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # 根据数据库实际结构,添加其他需要的字段 class Meta: db_table = "TABLE_NAME"
2. 修复视图查询逻辑
将错误的slug=uid改为id=uid,同时修正参数匹配问题:
情况1:保留URL中的两个参数
# view.py def Insert_Record(request, id, uid): obj_uid = Get_Customer_ID.objects.get(id=uid) # 后续业务逻辑
情况2:移除URL中多余的id参数
如果URL里的<str:id>是冗余的,直接修改URL配置:
# url.py path('form/<slug:uid>', views.Insert_Record),
对应的视图调整为:
# view.py def Insert_Record(request, uid): obj_uid = Get_Customer_ID.objects.get(id=uid) # 后续业务逻辑
3. 确认URL参数类型
UUID的字符(包含-)符合slug参数的规则,用<slug:uid>或<str:uid>都可以,只要和视图接收的参数名一致即可。
验证
修复完成后,访问对应链接时,Django会通过UUID主键正确查询到Get_Customer_ID的记录,不会再抛出FieldError。
内容的提问来源于stack exchange,提问作者user16514821
相关产品推荐
相关产品推荐

