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类型的等值比对,直接抛出操作符不存在的错误。
修复方案
- 修正序列化器的模型绑定,将
CartItemSerializer的model属性改为正确的CartItem:
class CartItemSerializer(serializers.ModelSerializer): class Meta: # 修正:绑定到对应CartItem模型 model = CartItem fields = ['id', 'product', 'quantity']
(开发环境可选,修正序列化器仍报错时执行)清理不一致的迁移文件:
- 删除对应app下
migrations目录内除__init__.py外的所有历史迁移文件 - 清空数据库内对应业务表(无重要数据前提下操作)
- 重新执行
python manage.py makemigrations、python manage.py migrate生成并执行迁移,确保数据库中Cart主键为uuid类型、CartItem的cart外键字段也为uuid类型,和模型定义完全一致。
- 删除对应app下
额外代码优化:原CartItem模型的
unique_together写法不符合业务逻辑,原配置会分别给cart、product字段加独立唯一约束,导致一个购物车只能加一个商品、一个商品只能属于一个购物车。正确写法如下:
class Meta: unique_together = [['cart', 'product']]
修复完成后重启服务,通过UUID路径访问购物车接口即可正常返回数据,不会再触发类型不匹配报错。
内容的提问来源于stack exchange,提问作者Quazi Md Aldin Fardin
相关产品推荐
相关产品推荐

