我需要通過比較相關對象上的日期來篩選查詢集,但篩選器被忽略。按prefetch_related日期篩選查詢集
我的恢復模式是:
class Requerimiento(models.Model):
nombre = models.CharField(max_length=30)
fecha_publicacion = models.DateField(default=datetime.now)
fecha_aprobacion = models.DateField(default=datetime.now, blank=True)
aprobacion = models.BooleanField()
autor = models.ForeignKey(User, null=True, blank=True)
def __unicode__(self):
return self.nombre
class Contexto(models.Model):
nombre = models.CharField(max_length=30)
requerimientos = models.ManyToManyField(Requerimiento,
related_name = 'contextos')
def __unicode__(self):
return self.nombre
class Proyecto(models.Model):
nombre = models.CharField(max_length=30)
cod_proyecto = models.CharField(max_length=10)
contextos = models.ManyToManyField('Contexto', related_name = 'proyectos')
fecha_publicacion = models.DateField(default=datetime.now)
autor = models.ForeignKey(User, null=True, blank=True)
而且查詢集是:
queryset=Proyecto.objects.filter(pk=proyecto_id)\
.prefetch_related('contextos')\
.prefetch_related('contextos__requerimientos')\
.filter(contextos__requerimientos__fecha_aprobacion__lte=F('fecha_publicacion'))
什麼,我做錯了什麼?
SELECT ••• FROM "sgrs_proyecto" INNER JOIN "sgrs_proyecto_contextos"
ON ("sgrs_proyecto"."id" = "sgrs_proyecto_contextos"."proyecto_id")
INNER JOIN "sgrs_contexto" ON ("sgrs_proyecto_contextos"."contexto_id" =
"sgrs_contexto"."id") INNER JOIN "sgrs_contexto_requerimientos"
ON ("sgrs_contexto"."id" = "sgrs_contexto_requerimientos"."contexto_id")
INNER JOIN "sgrs_requerimiento" ON ("sgrs_contexto_requerimientos"."requerimiento_id" = "sgrs_requerimiento"."id")
WHERE ("sgrs_proyecto"."id" = 2 AND "sgrs_requerimiento"."fecha_aprobacion"
<= "sgrs_proyecto"."fecha_publicacion")
第二個查詢:
編輯
與調試工具欄裏我看到下面的代碼
requerimientos = ProyectoFilter(request.GET,
queryset=Proyecto.objects.filter(pk=proyecto_id)
.distinct()
.prefetch_related('contextos')
.prefetch_related('contextos__requerimientos')
.filter(contextos__requerimientos__fecha_aprobacion__lte=F('fecha_publicacion')))
首先查詢選擇proyect ID 2以下的展望
SELECT ••• FROM "sgrs_contexto" INNER JOIN "sgrs_proyecto_contextos"
ON ("sgrs_contexto"."id" = "sgrs_proyecto_contextos"."contexto_id")
WHERE "sgrs_proyecto_contextos"."proyecto_id" IN (2)
ORDER BY "sgrs_contexto"."indice_riesgo" DESC
第三個查詢:
SELECT ••• FROM "sgrs_requerimiento" INNER JOIN "sgrs_contexto_requerimientos"
ON ("sgrs_requerimiento"."id" = "sgrs_contexto_requerimientos"."requerimiento_id")
WHERE "sgrs_contexto_requerimientos"."contexto_id" IN (3, 7, 6, 4, 2, 5, 1)
日期過濾器是第一個查詢,並應在第三,這是正確的? 我如何獲得正確的過濾器位置?
謝謝
@mariodev,即使我糾正縮進這仍然無法正常工作。 – Nextoor