こんにちは、かなり複雑なクエリを実行する必要があります。そして、ある時点まで、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(...) を使用できないようで、式が不可能になります。
何か案は?