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?
Asset.objects.filter( project__name__contains="Foo" )
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.
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