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(...) を使用できないようで、式が不可能になります。

何か案は?

4

1 に答える 1

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 の例を提供していただけますか?

于 2013-04-02T05:54:09.297 に答える