2009-09-03 2 views
0

Привет (извините за мой плохой английский)!Django: удалить GROUP BY, добавленный с помощью метода extra()?

Когда я делаю это:

gallery_qs = Gallery.objects.all()\ 
        .annotate(Count('photos'))\ 
        .extra(select={'photo_id': 'photologue_photo.id'}) 

Запрос SQL является:

SELECT (photologue_photo.id) AS `photo`, `photologue_gallery`.* 
FROM `photologue_gallery` 
    LEFT OUTER JOIN `photologue_gallery_photos` 
     ON (`photologue_gallery`.`id` = `photologue_gallery_photos`.`gallery_id`) 
    LEFT OUTER JOIN `photologue_photo` 
     ON (`photologue_gallery_photos`.`photo_id` = `photologue_photo`.`id`) 
GROUP BY `photologue_gallery`.`id`, photologue_photo.id 
ORDER BY `photologue_gallery`.`publication_date` DESC 

Проблема заключается в том, что extra метод автоматически добавляет photologue_photo.id в предложения GROUP BY. И мне нужно удалить его, так как он дублирует галереи, например:

[<Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>] 

Si мне нужно сделать этот запрос с Джанго, возможно ли это?

SELECT (photologue_photo.id) AS `photo`, `photologue_gallery`.* 
FROM `photologue_gallery` 
    LEFT OUTER JOIN `photologue_gallery_photos` 
     ON (`photologue_gallery`.`id` = `photologue_gallery_photos`.`gallery_id`) 
    LEFT OUTER JOIN `photologue_photo` 
     ON (`photologue_gallery_photos`.`photo_id` = `photologue_photo`.`id`) 
GROUP BY `photologue_gallery` 
ORDER BY `photologue_gallery`.`publication_date` DESC 

Спасибо! :)

+0

Насколько я вижу, запрос не будет работать, если вы удалите его из GROUP_BY. Если он находится в SELECT, он должен присутствовать в GROUP_BY. – simplyharsh

+0

Я использую второй запрос, и он работает. Почему нет ? – 2009-09-03 12:56:46

ответ

1

Я не думаю, что вам действительно нужно дополнительное. Из концепции Django вам не нужно вишня выбирать определенные столбцы при запуске Django QuerySet. Эта логика может быть выполнена со стороны шаблона.

Я предполагаю, что вы знаете, как нажать galley_qs в шаблон с вашей точки зрения:

# views.py 
gallery_qs = Gallery.objects.all()\ 
       .annotate(Count('photos')) 

В вашем шаблоне/html:

{% for gallery in gallery_qs %} 
    {% for photo in gallery.photos %} 

    {% endfor %} 
{% endfor %} 

photos Ваш ManyToManyField в вашей галерее модели.

+0

Мне не нужно делать это в своем шаблоне, но на мой взгляд, потому что я хочу выбрать галереи и * одну фотографию в соответствии с состоянием пользователя (например, мне нужно выбрать галереи с одной публичной фотографией для посетителей. чтобы исключить галереи, не публиковать их для посетителей.) – 2009-09-07 20:39:31

0

Почему вы пытаетесь получить отдельные записи в галерее с аннотацией photo_id на них, когда галерея на фото идентификаторы - это много-много отношений? Из того, что я могу сказать, запрос, который вы делаете, получит только один идентификатор фотографии для каждой галереи.

Если вам действительно нужно сделать вышеизложенное, я думаю, вы могли бы использовать distinct() для получения отдельных записей в галерее (кстати, вам не нужно «all()» там).

Gallery.objects.distinct()\ 
       .annotate(Count('photos'))\ 
       .extra(select={'photo_id': 'photologue_photo.id'}) 

Или вы можете просто получить доступ к идентификатор фотографии непосредственно,

g = Gallery.objects.annotate(Count('photos')) 
# Get the photo 
photo = g.photos[0] 
+0

Привет, я пробовал использовать distinct(), но я всегда дублировал галереи: '' [<Галерея: Lorem ipsum dolor sit amet>, <Галерея : Lorem ipsum dolor sit amet>, <Галерея: Lorem ipsum dolor sit amet>, <Галерея: Lorem ipsum dolor sit amet>, <Галерея: Lorem ipsum dolor sit amet>, <Галерея: Lorem ipsum dolor sit amet>, <Галерея : Lorem ipsum dolor sit amet>] '' – 2009-09-07 20:36:15

 Смежные вопросы

  • Нет связанных вопросов^_^