0

J'utilise 'OrderingFilter' pour autoriser la commande. Selon la documentation de Django, en ne spécifiant pas 'ordering_fields', vous pouvez commander par n'importe quel champ mentionné dans le sérialiseur de vue. J'ai un champ qui est fondamentalement un champ @property dans le sérialiseur. Mais en essayant de commander par ce domaine, je reçois l'erreur suivante:Django Commande par champ de propriété

Cannot resolve keyword 'spec_identifier' into field. Choices are:.... 

Cela fait partie de la vue du modèle:

class ItemViewSet(BaseViewMixin, MyModelView): 
    permission_classes = [MyItemViewPermissions] 
    serializer_class = ItemSerializer 
    filter_backends = (ItemFilter, OrderingFilter,) 

ce qui est la définition de la propriété que je veux commander par:

@property 
def spec_identifier(self): 
    return self.spec.identifier if self.spec else None 

Est-il possible de le commander?

Répondre

0

vous pouvez commander et obtenir des valeurs propriété, mais vous pouvez commander par un domaine connexe, par exemple

Item.objects.all().order_by('spec__identifier') 
+0

Je veux permettre de le faire à partir du client avec requête param - '? Commande = spec_identifier' en utilisant la OrderingfFilter, même chose que les autres champs – user2880391

+1

avez-vous essayé '? ordering = spec__identifier' double trait de soulignement dans la chaîne de requête? –

0

S'il vous plaît essayer le code suivant.

class ItemViewSet(BaseViewMixin, MyModelView): 
    permission_classes = [MyItemViewPermissions] 
    serializer_class = ItemSerializer 
    filter_backends = (ItemFilter, OrderingFilter,) 
    ordering_fields = ('spec__identifier',) 
1

Ainsi, après la recherche et de tâtonnements, ce fut la solution:

ordering_fields = tuple(serializer_class.Meta.fields + ['spec__identifier'])