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")
4 Réponses :
Je ne suis pas sûr que vous puissiez y parvenir avec un NB: Code non testé! Strong> p> Vous pouvez ensuite créer des relations suivantes dans la coque comme suit . P> de nombreux tomanyfield code>. Vous pouvez essayer de définir le modèle intermédiaire explicitement.
>>> qs = FollowerRelationship.objects.filter(follower=a).order_by('id')
>>> [fr.following for fr in qs]
Je viens de trouver un moyen de le faire sans avoir à créer une classe pour la relation. Il repose sur la fonctionnalité remarque que Voici un exemple de SQL créé sous les couvertures avec de fausses table et de colonnes: p> Extra code> qui vous permet d'ajouter des colonnes supplémentaires à la sortie. Dans votre exemple, il ressemblerait à:
appname_user_user_followinging code> 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. P>
Cela a fonctionné pour moi. Vous devez mettre le code après «sélection» dans les accolades, car il nécessite une dicte.
En fait (au moins dans Django 1.10), vous n'avez pas besoin d'utiliser la fonctionnalité Pour cette question particulière: P>
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. P> supplémentaire code> 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 code>. E.g. P>
pizza.toppings.all (). ordre_by ('appname_pizza_toppings.id') code> p>
article.tags.All (). Commande_by ('appname_article_tag.id') code> p>
theuser.flollowing.filter (user__is_active = true) \
.Order_by ("appname_user_user_following.id") code> p>
Testé avec 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? ). p> Ainsi une mise à jour La réponse de @ Ry4an Brase peut ressembler à p> django 1.11.10 code>.
Cela devrait être la réponse acceptée. Merci@ dušan maďar
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.