web-dev-qa-db-fra.com

Django - filtrage sur les propriétés de clés étrangères

J'essaie de filtrer une table dans Django en fonction de la valeur d'un champ particulier d'une clé étrangère.

Par exemple, j'ai deux modèles - 

# models.py
class Asset(models.Model):
 name = models.TextField(max_length=150)
 project = models.ForeignKey('Project')

class Project(models.Model):
 name = models.TextField(max_length=150)

J'aimerais filtrer ma liste d'actifs en fonction du nom du projet associé.

Actuellement, je réalise deux requêtes:

# views.py
project_list = Project.objects.filter(name__contains="Foo")         
asset_list = Asset.objects.filter( desc__contains=filter, project__in=project_list).order_by('desc')

Je me demande s'il existe un moyen de spécifier ce type de filtrage dans la requête principale?

69
Fraser Graham

Asset.objects.filter( project__name__contains="Foo" )

121
Fragsworth

Cela est possible depuis que la branche queryset-refactor a atterri avant la 1.0. Ticket 4088 a exposé le problème. Cela devrait fonctionner:

Asset.objects.filter(
    desc__contains=filter,
    project__name__contains="Foo").order_by("desc")

La Documentation Django Many-to-one présente cet exemple ainsi que d’autres exemples de clés étrangères utilisant l’API modèle.

12
Michael Greene
student_user = User.objects.get(id=user_id)
available_subjects = Subject.objects.exclude(subject_grade__student__user=student_user) # My ans
enrolled_subjects = SubjectGrade.objects.filter(student__user=student_user)
context.update({'available_subjects': available_subjects, 'student_user': student_user, 
                'request':request, 'enrolled_subjects': enrolled_subjects})

Dans ma candidature ci-dessus, je suppose qu'une fois qu'un élève est inscrit, une instance SubjectGrade de sujet sera créée, qui contient le sujet inscrit et l'étudiant lui-même.

Le modèle Subject and Student User est une clé étrangère du modèle SubjectGrade.

Dans "available_subjects", j’ai exclu toutes les matières déjà inscrites par l’étudiant_utilisateur actuel en vérifiant toutes les instances de mise à niveau ayant l’attribut «student» en tant qu’utilisateur étudiant

PS. Toutes mes excuses à l'avance si vous ne pouvez toujours pas comprendre à cause de mon explication. C'est la meilleure explication que je puisse fournir. Merci beaucoup 

0
Kinowe