2013-12-17 103 views
0

我需要通過比較相關對象上的日期來篩選查詢集,但篩選器被忽略。按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) 

日期過濾器是第一個查詢,並應在第三,這是正確的? 我如何獲得正確的過濾器位置?

謝謝

+0

@mariodev,即使我糾正縮進這仍然無法正常工作。 – Nextoor

回答

0

好的,終於明白了。 我從查詢集中取出過濾器,並在模板中進行比較。

剛剛添加的以下內容:

... 
{% for requerimiento in contexto.requerimientos.all %} 
{% if requerimiento.fecha_aprobacion <= proyecto.fecha_publicacion %} 
... 

希望這會幫助別人。

0

首先,prefetch_related的使用是不正確的。請參閱https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related中的第一個註釋。其次,您可能希望在帶有m2m關係的篩選器上使用distinct()。

您發佈的查詢應該會爲您提供所有至少有一個相關的Requerimiento的feye_aprobacion小於或等於其自己的fecha_aprobacion的所有Proyecto對象。您對查詢有什麼期望?您會得到什麼?

+1

我需要從特定的Proyect,所有相關的上下文以及每個上下文中的所有相關需求中獲得。但是我需要過濾這些需求,比proyect的發佈日期(fecha_publicacion)要有approve_date(fecha_aprobacion)lte。我不介意截然不同,因爲在模板中,我將在上下文需求組中顯示結果。 – Nextoor

+0

在調試工具欄沒有拉斯過濾器,我看到這樣的查詢: 選擇以 「_prefetch_related_val_proyecto_id」, 「sgrs_contexto」, 「ID」, 「sgrs_contexto」 「農佈雷」,「sgrs_contexto( 「sgrs_proyecto_contextos」 「proyecto_id」)。 「。」descripcion「,」sgrs_contexto「,」critico「,」sgrs_contexto「。」indice_riesgo「FROM」sgrs_contexto「INNER JOIN」sgrs_proyecto_contextos「ON(」sgrs_contexto「。」id「=」sgrs_proyecto_contextos「。」contexto_id「)WHERE」 sgrs_proyecto_contextos「。」proyecto_id「IN(1)ORDER BY」sgrs_contexto「。」indice_riesgo「DESC – Nextoor