【问题标题】:How to write raw sql with extra data with django orm?如何使用 django orm 编写带有额外数据的原始 sql?
【发布时间】:2016-05-19 15:03:27
【问题描述】:

我想使用 django orm 编写以下查询。 型号:

class Blog(models.Model):
    author = models.CharField(max_length=200)
    text = models.TextField()

class BlogImage(models.Model):
    blog = models.ForeignKey('Blog')
    image_url = models.CharField()
    principal = models.BooleanField()

查询将是

select * ,
   (
     select image_url 
     from blog_image bi 
     where bi.blog_id = b.id 
        and bi.principal=1
   ) as blog_main_image
from blog b

任何想法,如何用查询集编写?

【问题讨论】:

  • 你能发布你的models.py吗?
  • 这是一个相关的子查询,用模型写起来太难了。既然你已经有了查询,是什么阻止你将它传递给 objects.raw() ?
  • 这只是一个例子,我的整个查询比这更复杂

标签: django django-queryset


【解决方案1】:

你可以使用 djangos 的原始函数。 https://docs.djangoproject.com/en/1.9/topics/db/sql/

【讨论】:

    【解决方案2】:
    Blog.objects.all().extra("select={'blog_main_image': "select image_url 
         from blog_image 
         where blog_id = blog.id 
            and principal=1}")
    

    或者只是循环浏览博客并获取图像

    blogs = Blog.objects.all()
    for blog in blogs:
        if blog.blogimage_set.filter(principal=1).exists():
            main_image = blog.blogimage_set.filter(principal=1)[0]
        else:
            main_image = None
    

    【讨论】:

    • 不错但不推荐额外的,循环会破坏性能。
    【解决方案3】:

    在 google 上的 django 用户组上找到答案:

    from django.db.models import Prefetch
    
    Blog.objects.all().prefetch_related(
        Prefetch('image', 
                 queryset=BlogImage.objects.filter(principal=1), 
                 to_attr='blog_main_image'
                )
    )
    

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 2020-10-21
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多