decir que tengo los siguientes modelos:Django Relaciones genéricos y ORM consultas
class Image(models.Model):
image = models.ImageField(max_length=200, upload_to=file_home)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
class Article(models.Model):
text = models.TextField()
images = generic.GenericRelation(Image)
class BlogPost(models.Model):
text = models.TextField()
images = generic.GenericRelation(Image)
¿Cuál es la forma más en procesadores y la memoria-eficiente para encontrar todos los artículos que tienen al menos una imagen adjunta a ellos?
he hecho esto:
Article.objects.filter(pk__in=Image.objects.filter(content_type=ContentType.objects.get_for_model(Article)).values_list('object_id', flat=True))
que funciona, pero además de ser fea se necesita siempre.
Sospecho que hay una mejor solución con SQL sin formato, pero eso me supera. Por lo que vale la pena, el SQL generado por el anterior es el siguiente:
SELECT `issues_article`.`id`, `issues_article`.`text` FROM `issues_article` WHERE `issues_article`.`id` IN (SELECT U0.`object_id` FROM `uploads_image` U0 WHERE U0.`content_type_id` = 26) LIMIT 21
EDIT: sugerencia de czarchaic tiene una sintaxis mucho mejor pero aún peor rendimiento (más lento). El SQL generado por la consulta tiene el siguiente aspecto:
SELECT DISTINCT `issues_article`.`id`, `issues_article`.`text`, COUNT(`uploads_image`.`id`) AS `num_images` FROM `issues_article` LEFT OUTER JOIN `uploads_image` ON (`issues_article`.`id` = `uploads_image`.`object_id`) GROUP BY `issues_article`.`id` HAVING COUNT(`uploads_image`.`id`) > 0 ORDER BY NULL LIMIT 21
EDIT: Hurra por Jarret Hardie! Aquí está el SQL generado por su debe-tener-sido-obvia solución:
SELECT DISTINCT `issues_article`.`id`, `issues_article`.`text` FROM `issues_article` INNER JOIN `uploads_image` ON (`issues_article`.`id` = `uploads_image`.`object_id`) WHERE (`uploads_image`.`id` IS NOT NULL AND `uploads_image`.`content_type_id` = 26) LIMIT 21
¿Es esta su estructura modelo real, o hay toda una jerarquía de clases que no se está representando en su pregunta ejemplo por razones de simplicidad? Lo pregunto porque este ejemplo particular no requiere genéricos en absoluto. –
No, esta es una estructura de modelo simplificada y simplificada. – hanksims
Aunque su respuesta aceptada funciona bastante bien, tengo curiosidad por saber cuál sería la solución si necesitara algo más que 'al menos una imagen'. – czarchaic