Django-외래 키 속성 필터링


105

특정 필드의 값을 기반으로 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')

기본 쿼리에서 이러한 종류의 필터링을 지정하는 방법이 있는지 궁금합니다.

답변:


167

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


1
고마워, 나는 그것을 시도했지만 분명히 이중 밑줄을 사용하는 것을 잊었다.
Fraser Graham

3
필요하다 ??
DeadDjangoDjoker

@DeadDjangoDjoker contains는 django ORM이 생성하는 쿼리에서 사용되는 비교 유형을 설명하며 SQL은 아마도 LIKE '%Foo%'.
orangecaterpillar

17

이는 queryset-refactor브랜치가 1.0 이전에 출시 된 이후로 가능 했습니다. 티켓 4088 이 문제를 노출했습니다. 이것은 작동합니다.

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

장고 대일 문서는 이것과 모델의 API를 사용하여 외부 키를 다음의 다른 예를 가지고있다.


1
이것이 DB에 두 번 부딪 힐 것입니까? select_related ()를 사용하여 더 최적화해야합니까?
Fraser Graham

5
.query.as_sql ()을 추가하여 실제로 어떤 SQL이 실행되는지 확인할 수 있습니다.
fastmultiplication

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_user로 "student"속성이있는 모든 과목 등급 인스턴스를 확인하여 현재 student_user가 이미 등록한 모든 과목을 제외했습니다.

추신. 제 설명 때문에 여전히 이해가 안된다면 미리 사과드립니다. 이것이 내가 제공 할 수있는 가장 좋은 설명입니다. 정말 고맙습니다


코드 블록에 텍스트, 설명 또는 주석을 편집하고 추가하여 컨텍스트에 넣는 것이 좋을 것이라고 생각합니다.
엘리사 세 노오

나는 설명을 제공합니다. 감사 @ElishaSenoo
Kinowe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.