gpt4 book ai didi

sql - Django 通用关系和 ORM 查询

转载 作者:行者123 更新时间:2023-12-04 12:01:42 25 4
gpt4 key购买 nike

假设我有以下型号:

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)

查找至少附有一个图像的所有文章的处理器和内存效率最高的方法是什么?

我已经这样做了:
Article.objects.filter(pk__in=Image.objects.filter(content_type=ContentType.objects.get_for_model(Article)).values_list('object_id', flat=True))

哪个有效,但除了丑陋之外,它需要永远。

我怀疑使用原始 SQL 有更好的解决方案,但这超出了我的范围。值得一提的是,上面生成的SQL如下:
 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

编辑: czarchaic 的建议有更好的语法,但性能更差(更慢)。他的查询生成的 SQL 如下所示:
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

编辑:杰瑞特·哈迪万岁!这是他应该已经很明显的解决方案生成的 SQL:
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

最佳答案

由于通用关系,您应该能够使用反向关系的传统查询集语义来查询此结构:

Article.objects.filter(images__isnull=False)

这将为任何 Article 产生重复项与多个 Image 相关的 s s,但您可以使用 distinct() 消除它查询集方法:
Article.objects.distinct().filter(images__isnull=False)

关于sql - Django 通用关系和 ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1950007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com