django modèle objet de filtre
J'ai tables appelé 'has_location" et "lieux". 'has_location' a user_has
et location_id
et sa propre id
qui est donné par django lui-même.
"lieux" ont plus de colonnes.
Maintenant je veux obtenir tous les emplacements de certains utilisateurs. Ce que j'ai fait est..(de l'utilisateur.id est connu):
users_locations_id = has_location.objects.filter(user_has__exact=user.id)
locations = Location.objects.filter(id__in=users_locations_id)
print len(locations)
mais je suis 0
par cette print
. J'ai des données dans la db. mais j'ai le sentiment que __in
n'accepte pas les modèles en id, est-il ?
grâce
Pouvez-vous nous montrer les parties pertinentes de ces trois définitions de modèle, s'il vous plaît?
sûr, mais ils sont juste un type normal de modèles. je pense que le point est plus ce que je peux utiliser
sûr, mais ils sont juste un type normal de modèles. je pense que le point est plus ce que je peux utiliser
__in
.OriginalL'auteur doniyor | 2013-03-26
Vous devez vous connecter pour publier un commentaire.
Vous utilisez has_location propre id de filtrer les lieux. Vous devez utiliser
location_id
s pour filtrer les sites:Vous pouvez également filtrer les endroits directement par l'inverse de la relation:
OriginalL'auteur Pavel Anossov
À l'aide de
__in
pour ce genre de requête est une commune anti-modèle dans Django: il est tentant, en raison de sa simplicité, mais elle s'adapte mal dans la plupart des bases de données. Voir les diapositives 66ff dans cette présentation par Christophe Pettus.Vous avez une plusieurs-à-plusieurs relations entre les utilisateurs et les lieux, représentée par le
has_location
table. Vous le feriez normalement décrire ce à Django à l'aide d'unManyToManyField
avec unthrough
table, quelque chose comme ceci:Alors vous pouvez chercher les endroits pour un utilisateur comme ceci:
Vous pouvez interroger les endroits de votre filtre opérations:
Et vous pouvez demander à ce que des utilisateurs de sites en être extraits de manière efficace à l'aide de la
prefetch_related()
méthode sur une requête définie.C'est certainement la peine d'apprentissage sur les bases de données si vous écrivez des applications Django. (Sinon, un jour, vous trouverez que votre application s'exécute trop lentement et vous n'avez aucune idée de comment résoudre le problème.) Une bonne première étape consiste à activer la journalisation des requêtes dans votre base de données et de surveiller le journal que vous testez votre site Django pour voir ce que les requêtes sont effectivement en cours d'exécution.
ouais, vous avez raison. je vais suivre vos conseils
OriginalL'auteur Gareth Rees
Que font vos modèles?
Pour votre doute,
__in
n'accepter filtré id.Pour votre code actuel, la solution:
OriginalL'auteur okm