0

Sim カードに関連するタスクのリストを含む表があります。タスクは、タスクで使用されるすべての SIM カードが同時に利用可能な場合にのみ実行できます。

表のタスクの例:

Task1 - IMEI1 & IMEI2
Task2 - IMEI1

IMEI1 のみの IMEI のリストがある場合、Task2 のみが必要です。IMEI1 と IMEI2 のリストがある場合、Task1 と Task2 が必要です。

このリストには乱数のシムが含まれていることに注意してください。

これが私のコードです:

class Sim(models.Model):
    msisdn = models.CharField(max_length=20, blank=False, null=False)
    imei = models.CharField(max_length=40, blank=False, null=False, default='IMEI')

class taskInQueue(models.Model):
     simInvolved = models.ManyToManyField(Sim)

つまり、taskInQueue私はそのタスクに 1 人以上Sim関与しています。関数では、シムのリストを含むすべてのタスクを取得しようとしています:

sim = getSimInvolved(_imeiList)  #_imeiList is a list of IMEI -> Sim is a list of SIm Objects

最初に私は次のことをしていました:

tasks = taskInQueue.objects.filter(simInvolved__in=sim, testsStatus='W').distinct().order_by('pk')

問題は、このクエリを使用すると、少なくとも 1 人のシムが関与するすべてのタスクが得られることです。したがって、前の例で を使用すると_imeiList=['IMEI1']、Task1 と Task2 を取得できますが、Task2 のみを取得する必要があります。

taskInQueueでは、どのシムがリストに含まれているかをフィルタリングするにはどうすればよい_imeiListでしょうか?

4

1 に答える 1

1

チェーンフィルターを使用していますか?

tasks = taskInQueue.objects.all()
for sim in sims:
    tasks = tasks.filter(simInvolved=sim)

# in the end tasks will only contains those tasks which required all sims
于 2012-12-19T21:40:13.873 に答える