1

私は、各人がとの間で指定された位置にある会社で働くことを決定するmodel名前を持っています:Company_Position_PersonstartDateendDate

class Company_Position_Person(models.Model):
    company_position=models.ForeignKey(Company_Position)
    person=models.ForeignKey(Person)
    startDate=models.CharField(max_length=25)
    endDate=models.CharField(max_length=25)

ここで、重複する日付に基づいて特定の人の同僚のリストを検索したいと思います。つまり、特定の人が働いていると同時にこの会社で働いている人を見つけます。たとえば、私はstartDate=2012-01-01-で会社でendDate=2012-21-12働いています。で同じ会社で働いていますstartDate=2012-08-01-endDate=2013-21-12現在の私の同僚です。カスタムマネージャーが役立つことがわかりましたが、クエリの実行中に重複を見つける方法と、マネージャーstartDateendDate特定の人物を渡す方法がわかりません。

4

2 に答える 2

3

オーバーラップの場合は4ケース、オーバーラップのない場合は2ケースです。

......********.......   Source User
........****.........   Target User Overlaping
....*****............   Target User Overlaping
..........*******....   Target User Overlaping
....************.....   Target User Overlaping

......********.......   Source User
..**.................   Target User Not Overlaping
................**...   Target User Not Overlaping

taget_end_date < source_begin_dateまたはの重複はありませんtarget_begin_date > source_end_date。次に、ここでオーバーラップします。

NOT (taget_end_date < source_begin_date or target_begin_date > source_end_date )

これは次と同じです。

   not (taget_end_date < source_begin_date ) 
 and 
   not( target_begin_date > source_end_date )

それは等しい

 taget_end_date >= source_begin_date  and  target_begin_date <= source_end_date 

あなたのコードの場合:

source = Company_Position_Person.objects.get( pk = 12 )
targets = Company_Position_Person.filter( startDate__lte = target.endDate ,
                                          endDate__gte = target.startDate )
于 2012-12-22T14:55:20.467 に答える
1

このクエリを試すことができます:

person = Company_Position_Person.objects.get(pk=...)
persons = Company_Position_Person.objects.exclude(startDate__gt=person.endDate, endDate__lt=person.startDate,pk=person.pk)
于 2012-12-22T15:01:58.363 に答える