2016-09-15 74 views
0

我在全球範圍內使用OrderingFilter通過settings.py,它的效果很好。Django Rest Framework排序篩選器,按嵌套列表長度排序

現在我想訂購一個來自ManyToManyField的嵌套列表的大小。這可能與默認OrderingFilter

如果不是,有沒有一種方法可以通過自定義過濾器來實現,同時將查詢參數ordering保留在url(http://example.com/recipes/?ordering=)中。爲了一致性。

哦,ManyToManyField是一個通過表一。

這些都是我models.py

class Recipe(models.Model): 
    name = models.CharField(max_length=255) 
    cook_time = models.FloatField() 
    ingredients = models.ManyToManyField(IngredientTag, through=Ingredient) 

serializers.py

class IngredientTagSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = IngredientTag 
     fields = ('id', 'label') 

class IngredientSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Ingredient 
     fields = ('amount', 'unit', 'ingredient_tag') 
     depth = 1 

class RecipeSerializer(serializers.ModelSerializer): 
    ingredients = IngredientSerializer(source='ingredient_set', many=True) 

    class Meta: 
     model = Recipe 
     fields = ('id', 'url', 'name', 'ingredients', 'cook_time') 
     read_only_fields = ('owner',) 
     depth = 2 

而且我views.py

class RecipeViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows recipes to be viewed or edited. 
    """ 
    queryset = Recipe.objects.all().order_by() 
    serializer_class = RecipeSerializer 
    permission_classes = (DRYPermissions,) 
    ordering_fields = ('cook_time',) #Need ingredient count somewhere? 

謝謝!

回答

0

嘗試:

class RecipeSerializer(serializers.ModelSerializer): 
    ingredients = IngredientSerializer(source='ingredient_set', many=True) 
    ingredients_length = serializers.SerializerMethodField() 

    class Meta: 
     model = Recipe 
     fields = ('id', 'url', 'name', 'ingredients', 'cook_time') 
     read_only_fields = ('owner',) 
     depth = 2 

    def get_ingredients_length(self, obj): 
     return obj.ingredients.count() 

然後爲了通過ingredients_length

編輯

在model.py,嘗試this

@property 
    def ingredient_length(self): 
     return self.ingredient_set.count() 
+0

首先你不能使用的'len個'對obj.redredients。你必須使用obj.ingredients.all()或其他東西,對吧?其次它不起作用。我得到一個'FieldError:無法解析關鍵字u'ingredients_length'到field.'我想我在某處讀取OrderingFilter在數據庫級別的工作,所以python計算字段不工作? –

+0

我編輯我的答案,希望這個幫助。 – Windsooon

+0

感謝您的幫助。在這兩種情況下,我都可以將字段顯示在我的API結果中,但在嘗試排序時仍然會出現FieldError。我唯一的選擇是使用自定義過濾器嗎? –