簡體   English   中英

Django通用關系和ORM查詢

[英]Django Generic Relations and ORM Queries

說我有以下型號:

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)

找到所有至少附有一個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

編輯: Jarret Hardie的萬歲! 這是他應該明顯的解決方案生成的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)

這將為與多個Image相關的任何Article生成重復Article ,但您可以使用distinct() QuerySet方法消除它:

Article.objects.distinct().filter(images__isnull=False)

我認為你最好的選擇是使用聚合

from django.db.models import Count

Article.objects.annotate(num_images=Count('images')).filter(num_images__gt=0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM