2011-04-28 19 views
7

Uso la antigua versión de Django 1.1 con hack, que admite join en extra(). Funciona, pero ahora es el momento de los cambios. Django 1.2 usa RawQuerySet, así que reescribí mi código para esa solución. El problema es que RawQuery no admite filtros, etc. que tengo muchos en el código. Excavando a través de Google, on CaktusGroup He encontrado que podría usar query.join(). Sería muy bueno, pero en código que tengo:QuerySet: LEFT JOIN con AND

LEFT OUTER JOIN "core_rating" ON 
("core_film"."parent_id" = "core_rating"."parent_id" 
AND "core_rating"."user_id" = %i 

En query.join() He escrito "core_film"."parent_id" = "core_rating"."parent_id" primera parte, pero no sé cómo añadir la segunda parte después de Y.
¿Existe alguna solución para Django, que podría usar JOINs personalizados sin reescribir todo el código de los filtros (Raw)?

Este es nuestro fragmento de código actual en actividades extra()

top_films = top_films.extra( 
    select=dict(guess_rating='core_rating.guess_rating_alg1'), 
    join=['LEFT OUTER JOIN "core_rating" ON ("core_film"."parent_id" = "core_rating"."parent_id" and "core_rating"."user_id" = %i)' % user_id] + extra_join, 
    where=['core_film.parent_id in (select parent_id from core_film EXCEPT select film_id from filmbasket_basketitem where "wishlist" IS NOT NULL and user_id=%i)' % user_id, 
      '(("core_rating"."type"=1 AND "core_rating"."rating" IS NULL) OR "core_rating"."user_id" IS NULL)', 
      ' "core_rating"."last_displayed" IS NULL'], 
    ) 

Respuesta

2

Por desgracia, la respuesta es no.

El Django ORM, como la mayoría de Django, sigue la filosofía de que las cosas fáciles deberían ser fáciles y las cosas difíciles deberían ser posibles. En este caso, definitivamente se encuentra en el área de "cosas difíciles" y la solución "posible" es simplemente escribir la consulta sin procesar. Definitivamente hay situaciones como esta en las que escribir la consulta en bruto puede ser difícil y se siente un poco asqueroso, pero desde la perspectiva del proyecto situaciones como esta son demasiado raras para justificar el costo de agregar dicha funcionalidad.

+0

Bien, gracias. Pensé, que tal vez exista algún tipo de truco para eso. –