django rest framework filter忽略映射到enum的int字段

时间:2014-06-23 18:00:04

标签: python django django-models django-views django-rest-framework

我希望对堆栈溢出社区进行简单的查询。

鉴于以下配置,我在“Totals”模型上有一个相当简单的int字段,似乎无法过滤到该字段上工作。

以下是来自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. 对所有“总计”的请求正常工作:GET / totals全部返回。
  2. 按位置“总计”的请求正常工作:GET / totals?location = 1返回位置1的所有总计。
  3. total_type对总计的请求返回0结果,错误:GET / totals?total_type = 1返回0结果。没有错误抛出。
  4. 查看调试工具栏,我可以看到使用Total模型不执行任何查询。它对django_Session和auth_user进行查询,就是这样。这些查询按预期返回。

    如果我同时使用params(location和total_type)调用,我可以看到它只使用WHERE子句中的位置进行查询,但API仍然没有返回任何结果......即使是查询也是如此(尽管错误地)。

    任何想法?

    Django 1.6.4 Python 2.7 djangorestframework 2.3.13

1 个答案:

答案 0 :(得分:5)

答案(在我发布问题后2分钟让我感到震惊):

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

像这样:

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

在我做出此更改之前,除了REST过滤参数之外,其他所有工作都让我感到惊讶。