本地与EC2服务器API返回结果不一致问题求助
你的问题是本地和EC2数据库数据一致,但调用for_custom_field接口时本地返回420条,EC2仅返回415条,结合给出的代码,按以下步骤排查:
核对查询集的实际范围
注意到你在for_custom_field方法里直接使用了self.queryset,而get_queryset方法返回的是过滤后的self.queryset.is_active()。这里存在潜在问题:ModelViewSet的self.queryset是初始的models.User.objects.all(),并没有应用is_active()的过滤逻辑。
先在本地和EC2分别执行两个查询:# 全量用户数 print(models.User.objects.all().count()) # 激活状态用户数 print(models.User.objects.is_active().count())对比两边的数值,确认EC2上的
is_active()管理器方法逻辑和本地完全一致,比如是否都是过滤is_active=True的用户,有没有部署时代码不一致的情况。排查序列化过程中的异常
ForSelectField的get_full_name方法里调用了instance.customer_set.filter_active().count(),如果EC2上某个用户的关联customer_set查询出现异常(比如数据库权限不足、关联表数据损坏),可能导致该用户无法被正常序列化,进而被排除在返回结果外。
可以在EC2临时开启Django的DEBUG=True,查看请求过程中的报错日志;或者在get_full_name里加日志打印,记录每个用户的处理情况,定位哪条数据未被序列化。检查过滤类的影响
虽然for_custom_field是自定义action,但UserFilter可能在EC2环境下被意外触发。比如本地请求没有带过滤参数,但EC2的请求默认携带了过滤条件,或者UserFilter的代码在部署时被修改。
测试时直接调用不带任何查询参数的接口,对比返回数量;同时核对本地和EC2的UserFilter代码逻辑是否完全一致。验证数据库数据的真实一致性
不要仅依赖主观判断,直接在本地和EC2的数据库执行SQL查询:-- 全量用户数 SELECT COUNT(*) FROM your_user_table; -- 激活状态用户数(对应is_active()过滤) SELECT COUNT(*) FROM your_user_table WHERE is_active = 1;确认两边的查询结果完全一致,排除数据同步不彻底的可能。
清除缓存影响
如果EC2上的Django配置了缓存(比如ORM查询缓存、数据库缓存),可能返回的是旧数据。尝试重启EC2上的服务,或者执行Django的缓存清除命令:python manage.py clearcache
附你提供的代码:
class UserViewSet(viewsets.ModelViewSet): serializer_class = serializers.UserSerializer queryset = models.User.objects.all() permission_classes = [NotAuthReadOnly] filter_class = UserFilter def get_queryset(self): return self.queryset.is_active() @action(methods=['get'], detail=False) def for_custom_field(self, request, **kwargs): serializer = serializers.ForSelectField(self.queryset, many=True) return Response(serializer.data) class ForSelectField(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(read_only=True) full_name = serializers.SerializerMethodField(read_only=True) def get_full_name(self, instance): return instance.name + ' ' \ + instance.user_code + ' ' \ + str(instance.customer_set.filter_active().count())
内容的提问来源于stack exchange,提问作者Anna Liu

