2013-04-01 5 views
1

안녕하세요. 상당히 복잡한 쿼리를 수행해야합니다. 그리고 어떤 점에서 장고가 객체를 반환하도록 관리 할 수 ​​있지만 일부는 복제됩니다.django에서 내부 조인을 사용하는 방법

모델은 ProjectType, ProjectIdea입니다. 회사에서 시작할 수있는 데이터베이스에서 프로젝트 유형을 선택해야합니다. 각 회사는 아이디어가 있고 특허를받지 않은 프로젝트를 시작할 수 있습니다. 특허가 만료되면 아이디어가 없어도 시작할 수 있습니다.

class ProjectType(models.Model): 
    patent_expires = models.DateTimeField(null=True) 
    patent_owner = models.ForeignKey(Company,null=True) 

#This really is just MtoN relationship 
class ProjectIdea(models.Model): 
    project = models.ForeignKey(ProjectType) 
    company = models.ForeignKey(Company) 

나는 다음과 같은 쿼리를 시도 : 나는 여러 많은 변화를 시도

#problem is that ProjectType(s), where patent expired and the company has idea for is returned twice 
models.ProjectType.objects.filter(Q(projectidea__company=request.user.company) | Q(patent_expires__lt=timezone.now())) 

#doesn't return projects where patent is expired and idea exists 
models.ProjectType.objects.filter(Q(projectidea__company=request.user.company),(Q(patent_owner__isnull=True) | Q(patent_owner=request.user.company))).filter(Q(patent_expires__lt=timezone.now()) | Q(patent_owner__isnull=True)) 

#returns only the projects where patent expired and idea exists. Omits the not patented projects, where idea exists 
q = models.ProjectType.objects.filter(Q(patent_expires__lt=timezone.now()) | Q(patent_owner=request.user.company)).filter(projectidea__company=request.user.company,patent_owner__isnull=True) 

.distinct() #has no effect what so ever 

을,하지만 난 그것을 제대로 작성하는 방법을 알아낼 수 없습니다. 나는 또한 .exclude()로만 접근을 시도했지만 Q (...) & Q (...)를 사용할 수 없어 표현이 불가능 해 보입니다.

아이디어가 있으십니까?

+0

첫 번째 쿼리에서'projectidea__company' 대신'patent_owner__company'가 아니 었습니까? – karthikr

+0

'business'가 맞는지 확실하지 않습니다. 그러나 아이디어는 회사가 첫 번째 프로젝트를 시작한 후에야 특허를 얻습니다. –

답변

1

나는이 일을 가정합니다 (내 의도를 올바르게 캡처했다고 가정).

our_ideas = Q(projectidea__company=request.user.company) 
has_patent = Q(patent_owner__isnull=False) 
patent_expired = Q(patent_expires__lt=timezone.now()) 

startable_projects = models.ProjectType.objects\ 
    .filter((~has_patent & our_ideas) | (has_patent & patent_expired)).distinct() 

그렇지 않은 경우 생성 된 SQL과 볼 것으로 예상되는 SQL의 예를 제공 할 수 있습니까?

+0

나의 대답이 당신을 도왔거나 당신에게 알렸다면, 받아 들일 수 있다고 생각하십니까? – Thomas

+0

이 작품, 고마워요! –

관련 문제