Django REST框架过滤器忽略映射到枚举的整数字段

4 投票
1 回答
1203 浏览
提问于 2025-04-18 10:48

我有一个希望能简单解决的问题,想请教一下大家。

在我的“Totals”模型里,有一个简单的整数字段,但我发现无法对这个字段进行过滤。

以下是来自models.py的对象:

class TotalType(Enum):
    daily_sum = 1
    weekly_sum = 2

class Total(models.Model):

    TOTAL_TYPES = (
        (TotalType.daily_sum, 'Daily Sum'),
        (TotalType.weekly_sum, 'Weekly Sum')
    )

    location = models.ForeignKey(Location, db_column='LocationId')
    ci_timestamp = models.DateTimeField(db_column='ci_TimeStamp', blank=False, null=False)
    amount = models.DecimalField(max_digits=12, decimal_places=2, blank=False, null=False)
    total_type = models.IntegerField(max_length=5, blank=False, choices=TOTAL_TYPES)

以下是来自urls.py的路由信息:

router = DefaultRouter()
router.register(r'totals', TotalViewSet)    
urlpatterns = patterns('',
    url(r'^', include(router.urls))
)

以下是我的对象序列化器:

class TotalSerializer(serializers.HyperlinkedModelSerializer):
    location = serializers.HyperlinkedRelatedField(view_name="location-detail", many=False)

    class Meta:
        model = Total
        fields = ('id', 'location', 'ci_timestamp', 'amount', 'total_type')

最后,这是视图的配置:

class TotalViewSet(viewsets.ReadOnlyModelViewSet):        
    filter_fields = ('total_type', 'location')    
    queryset = Total.objects.all()
    serializer_class = TotalSerializer

问题:

  1. 请求所有“totals”时可以正常工作:GET /totals 返回所有数据。
  2. 按地点请求“totals”也正常:GET /totals?location=1 返回地点1的所有总数。
  3. 按总数类型请求时却返回0个结果,这是不对的:GET /totals?total_type=1 返回0个结果。没有报错。

通过调试工具,我看到没有使用Total模型执行任何查询。它只对django_Session和auth_user进行了查询,其他的没有。这些查询的结果是正常的。

如果我同时使用两个参数(地点和总数类型),我能看到查询中只有地点在WHERE条件里,但API仍然返回没有结果...即使查询是有结果的(虽然是错误的)。

有没有什么想法?

Django 1.6.4
Python 2.7
djangorestframework 2.3.13

1 个回答

5

回答(我在发完问题后两分钟才想到的):

我需要在我的选择中使用枚举值,而不是代表名称/值对的实际对象。

像这样:

TOTAL_TYPES = (
    (TotalType.daily_sum.value, 'Daily Sum'),
    (TotalType.weekly_sum.value, 'Weekly Sum')
)

我很惊讶,除了在我做这个更改之前,REST过滤参数没有工作,其他的都正常。

撰写回答