Как связать наборы запросов в правильном порядке, не отсортированном по дате, отсортированному по ForeignKey? - PullRequest
0 голосов
/ 26 июня 2011

Я создаю фотогалерею, и те, которые публикуются, не дают мне того, что мне нужно, поэтому я создаю ее с нуля.

На главной странице мне нужно получить случайные альбомы (этов порядке) из модели «Альбом» и для каждого альбома взять одну из своих фотографий (random) из модели «Фото».

Модели:

class Album(models.Model):
    title = models.CharField('כותרת', max_length=100, db_index=True)
    created = models.DateTimeField('תאריך פרסום', auto_now_add=True)
    creator = models.ForeignKey(User, related_name='galleries_creator', verbose_name='נכתב ע"י')

class Photo(models.Model):
    title = models.CharField('כותרת', max_length=100)
    album = models.ForeignKey(Album, verbose_name='שייך לאלבום')
    photo = models.ImageField('תמונה', blank=True, upload_to=get_image_path)
    photo_mid = models.ImageField('תמונה בינונית', blank=True, upload_to='images/galleries/mid/', editable=False)
    photo_thumb = models.ImageField('תמונה קטנה', blank=True, upload_to='images/galleries/thumbs/', editable=False)
    created = models.DateTimeField('תאריך פרסום', auto_now_add=True)
    is_landscape = models.NullBooleanField(blank=True, verbose_name='האם תמונת לנדסקייפ', editable=False)

Дело в том, что, как ячтобы увидеть, что для перебора альбомов в шаблоне и получения правильной фотографии для альбома мне нужно связать список альбомов и список фотографий, которые я получил, но в правильном порядке (album object, photo object etc),но я получаю все альбомы, а затем все фотографии (в правильном порядке, но в шаблоне ничего не работает, очевидно).

Вид:

def index(request):
    albums = Album.objects.all().order_by('?')[:10]
    album_photo_lst = []
    for album in albums:
        album_photo_lst.append(Photo.objects.filter(album=album).order_by('?')[:1])
    album_list = list(chain(albums,album_photo_lst))
    return render_to_response('galleries/index.html',{'albums':album_list},  context_instance=RequestContext(request))

Может быть, яЯ слишком усложняю это, и, может быть, кто-нибудь поможет мне разобраться с этим.

10x, Erez

1 Ответ

1 голос
/ 26 июня 2011

Не пытаясь изменить ваши запросы, я предлагаю использовать список (album, photo) кортежей вместо длинного списка:

for album in albums:
    album_list.append((album, Photo.objects.filter(album=album).order_by('?')[0]))

теперь используйте

    {{ for album, photo in album_list }}

(И обязательно проверьте, что произойдет, если в альбоме 0 фотографий.)

...