Джанго - фільтрація за властивостями зовнішнього ключа


105

Я намагаюсь фільтрувати таблицю в Django на основі значення певного поля a ForeignKey.

Наприклад, у мене є дві моделі:

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

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

Я хотів би відфільтрувати список активів на основі назви асоційованого проекту.

На даний момент я виконую два запити:

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

Мені цікаво, чи є спосіб вказати такий тип фільтрації в головному запиті?

Відповіді:


167

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


1
Дякую, я спробував це, але, мабуть, забув використати подвійне підкреслення.
Фрейзер Грехем

3
чи містить необхідне ??
DeadDjangoDjoker

@DeadDjangoDjoker containsописує тип порівняння, який використовується у запиті, який виробляє ORD django, можливо, буде виглядати sql LIKE '%Foo%'.
помаранчева гусениця

17

Це стало можливим, оскільки queryset-refactorфілія висадилась до 1,0. Квиток 4088 викрив проблему. Це має працювати:

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

У документації Django "багато на один" є цей та інші приклади дотримання іноземних ключів за допомогою API API.


1
Чи вдасться двічі вдаритись до БД, чи варто використовувати select_related (), щоб зробити це більш оптимальним?
Фрейзер Грехем

5
Ви можете додати .query.as_sql (), щоб побачити, що саме sql буде виконано.
швидке множення

посилання на документи django повністю застаріло і розміщується на "410 Сторінку видалено": - /
szeitlin

0
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})

У моїй заявці вище, я припускаю, що як тільки студент буде записаний, буде створений предметний екземпляр SubjectGrade, який містить записаний предмет та сам студент.

Тема користувача та модель користувача є зовнішнім ключем до моделі SubjectGrade.

У "available_subjects" я виключив усі предмети, які вже зараховані поточним студентом_користувачем, перевіривши всі екземпляри предметів, які мають атрибут "student" як поточний student_user

PS. Вибачте заздалегідь, якщо ви все ще не можете зрозуміти через моє пояснення. Це найкраще пояснення, яке я можу надати. Дуже дякую


Я думаю, що буде чудово відредагувати та додати текст, пояснення чи коментар до блоку коду, щоб поставити його в контекст.
Elisha Senoo

Я надаю пояснення. Дякуємо @ElishaSenoo
Kinowe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.