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

Django PostgreSQL使用UUID主键报bigint=uuid运算符不存在错误

Django PostgreSQL UUID主键关联报类型不匹配错误修复

问题场景

Django项目使用PostgreSQL作为数据库,将UUID字段设置为模型主键后,访问携带GUID路径参数的API接口时触发数据库报错:
operator does not exist: bigint = uuid

原有项目代码

模型层(models.py)

import uuid
from django.db import models

# Product模型为业务提前定义的商品模型
class Cart(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)


class CartItem(models.Model):
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='items')
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField()

    class Meta:
        unique_together = [['cart'], ['product']]

序列化器层(serializers.py)

from rest_framework import serializers
from .models import Cart, CartItem


class CartItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = ['id', 'product', 'quantity']


class CartSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(read_only=True)
    items = CartItemSerializer(many=True)

    class Meta:
        model = Cart
        fields = ['id', 'items']

视图层(views.py)

from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin
from rest_framework.viewsets import GenericViewSet
from .models import Cart
from .serializers import CartSerializer


class CartViewSet(CreateModelMixin, RetrieveModelMixin, GenericViewSet):
    queryset = Cart.objects.prefetch_related('items__product').all()
    serializer_class = CartSerializer

报错根因

报错是关联查询时字段类型不匹配导致,核心问题出在序列化器配置错误:
CartItemSerializer的Meta.model属性错误绑定为Cart模型,而非其应当对应的CartItem模型。DRF在处理嵌套的items关联预取查询时,会基于错误的模型配置,默认将关联外键按整数类型(bigint)做匹配查询,但实际Cart表主键为UUID类型,PostgreSQL无法执行bigint和uuid类型的等值比对,直接抛出操作符不存在的错误。

修复方案

  1. 修正序列化器的模型绑定,将CartItemSerializer的model属性改为正确的CartItem:
class CartItemSerializer(serializers.ModelSerializer):
    class Meta:
        # 修正:绑定到对应CartItem模型
        model = CartItem
        fields = ['id', 'product', 'quantity']
  1. (开发环境可选,修正序列化器仍报错时执行)清理不一致的迁移文件:

    • 删除对应app下migrations目录内除__init__.py外的所有历史迁移文件
    • 清空数据库内对应业务表(无重要数据前提下操作)
    • 重新执行python manage.py makemigrations、python manage.py migrate生成并执行迁移,确保数据库中Cart主键为uuid类型、CartItem的cart外键字段也为uuid类型,和模型定义完全一致。
  2. 额外代码优化:原CartItem模型的unique_together写法不符合业务逻辑,原配置会分别给cart、product字段加独立唯一约束,导致一个购物车只能加一个商品、一个商品只能属于一个购物车。正确写法如下:

class Meta:
    unique_together = [['cart', 'product']]

修复完成后重启服务,通过UUID路径访问购物车接口即可正常返回数据,不会再触发类型不匹配报错。


内容的提问来源于stack exchange,提问作者Quazi Md Aldin Fardin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:57:26