Django REST框架过滤器忽略映射到枚举的整数字段
我有一个希望能简单解决的问题,想请教一下大家。
在我的“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
问题:
- 请求所有“totals”时可以正常工作:GET /totals 返回所有数据。
- 按地点请求“totals”也正常:GET /totals?location=1 返回地点1的所有总数。
- 按总数类型请求时却返回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过滤参数没有工作,其他的都正常。