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

使用shortuuid后Django后台存模型报object_id类型错误排查

问题分析与解决方法

核心原因

你遇到的Field 'object_id' expected a number but got 'id_b2cbfe2b1fd4313c'错误,本质是Django默认的Admin后台、或是内置的ContentType关联逻辑(比如日志、权限相关),默认假设模型主键为数值类型,但你的Channel模型用了带前缀的字符串型ShortUUIDField作为主键,导致类型校验失败。

另外你之前碰到的内置UUIDField错误,应该是因为传入的UUID格式不符合标准十六进制UUID规则(比如带了前缀、或用了自定义字母表),标准UUIDField只接受符合RFC 4122的UUID字符串。

解决步骤

1. 修正ShortUUIDField配置(适配字符串主键)

如果一定要保留前缀,需要显式指定字段类型为字符串,确保Django正确识别:

from shortuuid.django_fields import ShortUUIDField

class Channel(models.Model):
    id = ShortUUIDField(
        length=16,
        max_length=40,
        prefix="id_",
        alphabet="abcdefg1234",
        primary_key=True,
        # 显式指定字段类型为字符串,避免Django误判为数值类型
        field_type="CharField"
    )
    full_name = models.CharField(max_length=200) 
    user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True, related_name="channel")
    # 补充视图中用到的status字段,否则查询会报错
    status = models.CharField(max_length=20, default="active")

2. 自定义Admin类适配字符串主键

Django Admin默认会对主键做数值类型校验,需要自定义Admin类规避这个问题:

# admin.py
from django.contrib import admin
from .models import Channel

@admin.register(Channel)
class ChannelAdmin(admin.ModelAdmin):
    list_display = ('id', 'full_name', 'user', 'status')
    search_fields = ('id', 'full_name')
    
    # 覆盖默认的对象获取逻辑,跳过数值类型校验
    def get_object(self, request, object_id, from_field=None):
        try:
            return self.model.objects.get(pk=object_id)
        except self.model.DoesNotExist:
            return None

3. 修复视图与URL的匹配问题

你的视图参数是channel_name,但查询时用的是id=channel_name,如果参数实际是频道名称而非主键ID,会导致查询失败。如果参数确实是主键ID,建议修改参数名更清晰:

# views.py
def channel_profile(request, channel_id):
    channel = Channel.objects.get(id=channel_id, status="active")
    context = {
        "channel": channel,
    }
    return render(request, "channel/channel.html", context)

同时确保URL配置中的参数名与视图一致:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('channel/<str:channel_id>/', views.channel_profile, name='channel_profile'),
]

4. 内置UUIDField错误的补充说明

如果想换回内置UUIDField,必须确保传入的是标准UUID字符串(比如550e8400-e29b-41d4-a716-446655440000格式),不能加前缀或使用自定义字母表。如果需要带前缀的短UUID,继续使用shortuuid方案即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:15:46