2017-01-01 1 views
1

many to many 관계의 항목 목록을 쿼리하는 데 문제가 있습니다. 쿼리하려는 모델은 아래와 같습니다. 이것은 근로자가 "오프닝"을 선택하고 많은 근로자가 동일한 "오프닝"을 선택할 수있는 모델입니다. "오프닝"을 선택한 근로자 목록을 선택하려고하는데 성공하지 못했습니다. 내가 선택한 근로자 (ID-31)에 따라 개방의 유형 아래이 시도하기 때문에Django manytomany 질의 중 없음 및/또는 불행을 표시합니다.

class FavOpening(models.Model): 
    opening = models.OneToOneField(Openings, blank=True, default=None) 
    worker = models.ManyToManyField(Worker, blank=True, default=None) 

    def __unicode__(self): 
     return str(self.opening) 

그것은 매우 이상이며, 선택한 노동자가 인쇄 할 수있는 개방 작동합니다.

employee = get_object_or_404(Worker, id=31) 
print employee.favopening_set.all() 

하지만 아래의 방법을 사용하여 manytomany 내부에서 작업자를 얻으려면 다른 방법을 사용하면 작동하지 않습니다. Workers.Worker을 보여주는 - 그것은 내가 또한 개방 (ID = 1)하지만 난 어떤 결과를 얻기하지 오전에 따라 노동자의 목록을 가져올 수 아래하려고 노력

openingobj = get_object_or_404(Openings, id=1) 
print openingobj.favopening_set.all() 

속성 "favopening_set"을하지 않습니다 말한다. 나는 적어도 하나의 작업자가이 구멍을 선택해야하기 때문에 사실이 아니다 없음.

openingobj = get_object_or_404(Openings, id=1) 
print openingobj.favopening.worker 

마지막으로, 나는이이 아래를 얻기 위해 프리 페치를 사용하여 말한다 약간의 연구를 기반으로 시도 (나는 관리자에서 확인) 사물의 집합 - What's the difference between select_related and prefetch_related in Django ORM?,하지만 관리자는 오프닝 인스턴스를 통해 액세스 할 수 없다고 말합니다.

openingobj = get_object_or_404(Openings, id=1) 
openingobj.objects.prefetch_related('favopening_set').all() 

내가 어떻게 할 수 있는지에 대한 유용한 조언을 주셔서 감사합니다.

+1

왜'favopening_set'을 사용하려했는지 알 수 없습니다. 그것은 일대일 관계입니다. 그것은 집합이 아닙니다. 올바른 접근자는 다음 코드 조각에서 올바르게 사용 된'favopening'입니다. –

+0

안녕 다니엘, 나는 당신이 조언 한 것처럼 내가 사용자 favopening 때 개방과하지 노동자를 받고있다. 나는이 오프닝을 선택한 노동자 목록을 얻는 데 관리자가 필요하기 때문에 객체와 함께 favopening을 수행하려고 시도했지만 "인쇄 할 때 관리자가 FavOpening 인스턴스를 통해 액세스 할 수 없다"는 오류가 발생했습니다. dir (openingobj.favopening)은 객체가 사용할 수있는 속성 목록에 있음을 보여줍니다. – user3655574

답변

4

편집 응답은

그래서 당신이 개구부를 선택한 모든 노동자의 검색어 세트를 얻으려면 주석에 계정 피드백으로 촬영합니다. 아래 코드가 도움이됩니까?

openingobj = get_object_or_404(Openings, id=1) 
    workers_queryset = opening.favopening.worker.all() 

"worker"의 이름을 "worker"로 변경하는 것이 좋습니다.

+0

실제로 저는 질문 모음을 받아야합니다. - 공개를 선택한 근로자 목록. 나는 어쨌든 그것을 시도했지만 openingobj.favopening_set.all()을 사용했을 때 오류가 발생했습니다. 'FavOpening'객체에는 'all'속성이 없습니다. – user3655574

+1

감사합니다. Alex는 지금 작동합니다. 약간 수정하면 workers_queryset = opening.favopening.worker.all() 대신 workers_queryset = openingobj.favopening.worker.all()을 사용해야합니다. 결과는 노동자들에게 보여지기 때문에 나는 오프닝 붐에 빠져 들었다. 노동자들. 아니, 나는 혼란스럽고 그 이상을 계속하지 않았다. 고맙습니다!! – user3655574

+1

도움이 되니 기쁩니다! 오타를 유감스럽게 생각합니다. 실제로는 열지 않아야합니다. –