164 votes

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

J'essaie de filtrer une table dans Django en fonction de la valeur d'un champ particulier d'une ForeignKey .

Par exemple, j'ai deux modèles :

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, j'effectue deux des requêtes :

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 ?

236voto

Fragsworth Points 5854
Asset.objects.filter( project__name__contains="Foo" )

21voto

Michael Greene Points 6063

Cela a été possible depuis que le queryset-refactor La branche a atterri avant la version 1.0. Ticket 4088 a exposé le problème. Ça devrait marcher :

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

Le site Documentation Django Many-to-one contient cet exemple et d'autres exemples de suivi des clés étrangères à l'aide de l'API de modèle.

0voto

Kinowe Points 9
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 mon application ci-dessus, je suppose qu'une fois qu'un étudiant est inscrit, une instance SubjectGrade sera créée qui contient la matière inscrite et l'étudiant lui-même.

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

Dans "available_subjects", j'ai exclu toutes les matières qui sont déjà inscrites par l'utilisateur actuel de l'étudiant en vérifiant toutes les instances de niveau de matière qui ont l'attribut "student" comme l'utilisateur actuel de l'étudiant.

PS. Je vous prie de m'excuser à l'avance si vous ne pouvez toujours pas comprendre mes explications. C'est la meilleure explication que je puisse fournir. Merci beaucoup.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X