11
votes

Comment puis-je trier par l'ID d'un HeuresTomanfield à Django?

J'ai un multiling de plusieurs fois dans un objet utilisateur et il est utilisé pour mapper les utilisateurs que l'utilisateur suit. J'essaie de montrer une liste de sous-ensembles de ceux qu'ils ont récemment suivis. Y a-t-il une astuce dans .Order_by () qui me permettra de trier par l'ID du balancé de The TheryTomanfield? Les données sont là, non?

# (people the user is following)
following = models.ManyToManyField(User, related_name="following", blank=True)

theuser.following.filter(user__is_active=True).order_by("user__id")


3 commentaires

Question intéressante / étrange. Le champ d'identifiant de la table intermédiaire utilisée par de nombreusesTomanany pour faire la jointure est intéressant car ...?


@Peter, je pense que l'ID de cette table doit indiquer l'ordre des relations apportées afin qu'il puisse faire sa raison "Vous avez récemment suivi:" Idée.


@Brandon H, exactement ce que j'essaie de faire.


4 Réponses :


0
votes

Je ne suis pas sûr que vous puissiez y parvenir avec un de nombreux tomanyfield code>. Vous pouvez essayer de définir le modèle intermédiaire explicitement.

NB: Code non testé! Strong> p> xxx pré>

Vous pouvez ensuite créer des relations suivantes dans la coque comme suit . P>

>>> qs = FollowerRelationship.objects.filter(follower=a).order_by('id')
>>> [fr.following for fr in qs]


0 commentaires

5
votes

Je viens de trouver un moyen de le faire sans avoir à créer une classe pour la relation. Il repose sur la fonctionnalité Extra qui vous permet d'ajouter des colonnes supplémentaires à la sortie. Dans votre exemple, il ressemblerait à: xxx

remarque que appname_user_user_followinging est le nom de la table de relation Django crée sous les couvertures. C'est déterministe et quelque chose que vous pouvez obtenir et définir via des méta-mécanismes, mais il est à peu près sûr du codes hard.

Voici un exemple de SQL créé sous les couvertures avec de fausses table et de colonnes: xxx


1 commentaires

Cela a fonctionné pour moi. Vous devez mettre le code après «sélection» dans les accolades, car il nécessite une dicte.



5
votes

En fait (au moins dans Django 1.10), vous n'avez pas besoin d'utiliser la fonctionnalité supplémentaire mais peut simplement commander directement par le terrain. Il suffit d'utiliser le nom de la table automatiquement créé, suivi de ".Id" comme argument sur ordre_by . E.g.

pizza.toppings.all (). ordre_by ('appname_pizza_toppings.id')

article.tags.All (). Commande_by ('appname_article_tag.id')

Pour cette question particulière:

theuser.flollowing.filter (user__is_active = true) \ .Order_by ("appname_user_user_following.id")

De nombreuses autres solutions suggèrent de créer une coutume via une table et de l'ajout d'un champ, mais si vous souhaitez simplement trier par l'ID de la table générée automatiquement via, cela n'est pas nécessaire.


0 commentaires

4
votes

Testé avec django 1.11.10 .

Vous n'avez pas à coder le nom de la table de relation ( Comment lire le nom de la table de base de données d'une instance de modèle? ).

Ainsi une mise à jour La réponse de @ Ry4an Brase peut ressembler à xxx


1 commentaires

Cela devrait être la réponse acceptée. Merci@ dušan maďar