Подтвердить что ты не робот

Django - фильтрация свойств внешнего ключа

Я пытаюсь отфильтровать таблицу в Django на основе значения определенного поля 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')

Мне интересно, есть ли способ указать этот вид фильтрации в основном запросе?

4b9b3361

Ответ 1

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

Ответ 2

Это стало возможным с тех пор, как ветвь queryset-refactor приземлилась до версии 1.0. Билет 4088 выявил проблему. Это должно работать:

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

В документации Django Many-to-one есть этот и другие примеры использования внешних ключей с использованием API модели.

Ответ 3

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 субъекта, который содержит зарегистрированный предмет и самого студента.

Модель Subject и Student User - это внешний ключ к модели SubjectGrade.

В "available_subjects" я исключил все предметы, которые уже зарегистрированы текущим student_user, проверив все экземпляры subjectgrade, которые имеют атрибут "student" в качестве текущего student_user

PS. Заранее извиняюсь, если вы все еще не можете понять из-за моего объяснения. Это лучшее объяснение, которое я могу предоставить. огромное спасибо