Python django rest框架筛选器忽略映射到枚举的int字段

Python django rest框架筛选器忽略映射到枚举的int字段,python,django,django-models,django-views,django-rest-framework,Python,Django,Django Models,Django Views,Django Rest Framework,我希望有一个简单的堆栈溢出社区查询 考虑到以下配置,我的“Totals”模型中有一个相当简单的int字段,似乎无法对该字段进行过滤 这是模型中的对象。py: class TotalType(Enum): daily_sum = 1 weekly_sum = 2 class Total(models.Model): TOTAL_TYPES = ( (TotalType.daily_sum, 'Daily Sum'), (TotalType

我希望有一个简单的堆栈溢出社区查询

考虑到以下配置,我的“Totals”模型中有一个相当简单的int字段,似乎无法对该字段进行过滤

这是模型中的对象。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)
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
这是来自URL的路由器信息。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)
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
这是我的对象序列化程序:

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)
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
最后,这里是视图配置:

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)
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
问题:

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)
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
  • 对所有“总计”的请求工作正常:GET/totals返回all
  • 按位置请求“总计”效果良好:GET/totals?location=1返回位置1的所有总计
  • 按总计类型请求总计时返回0个结果,错误:GET/totals?TOTALL_type=1返回0个结果。没有抛出错误 查看调试工具栏,我可以看到没有使用Total模型执行任何查询。它对django_会话和auth_用户进行查询,就是这样。这些查询按预期返回

    如果我同时使用两个参数(location和total_type)调用,我可以看到它只使用WHERE子句中的location进行查询,但是API仍然没有返回结果……即使查询返回了结果(尽管是错误的)

    有什么想法吗

    Django 1.6.4 Python 2.7 djangorestframework 2.3.13

    答案(在我发布问题2分钟后,我突然想到):

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

    像这样:

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

    我很惊讶,在我进行此更改之前,除了REST筛选参数之外,其他一切都正常工作。

    对该问题进行了投票,因为即使是这个问题也帮助我了解了如何正确使用此功能。非常感谢。