2016-05-19 1 views
-1

Я хотел бы написать следующий запрос, используя django orm. модели:Как написать raw sql с дополнительными данными с помощью 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 

Любая идея, как написать, что с QuerySet?

+0

Вы можете оставить models.py? – Anoop

+0

@Anoop, добавлена ​​модель –

+0

Это коррелированный подзапрос, который трудно писать с помощью моделей. Поскольку у вас уже есть запрос, что мешает вам передать его object.raw()? – e4c5

ответ

0
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 
+0

хороший, но дополнительный не рекомендуется, петля разрушает производительность. –

0

найти ответ на Джанго группы пользователей на Google:

from django.db.models import Prefetch 

Blog.objects.all().prefetch_related(
    Prefetch('image', 
      queryset=BlogImage.objects.filter(principal=1), 
      to_attr='blog_main_image' 
      ) 
)