سؤال

أحاول الحصول على صورة عشوائية من كل ألبوم من البيانات التي تم إنشاؤها بواسطة SynCr. يبدو النموذج (اختصار) مثل هذا:


class Album(models.Model):
    title = models.CharField(max_length=200)
    photos = models.ManyToManyField('Photo')

class Photo(models.Model):
    title = models.CharField(max_length=200)

لقد جربت الكثير من الأساليب المختلفة دون نجاح. هل هذا آخر سهل؟

خذ 2: الرمز النهائي:

صالات العرض (الطلب، Template_name = 'Galleries.html'):

albums = Album.objects.select_related().all()
album_list = []
for album in albums:
   album_list.append({'title':album.title, 'id':album.id, 'photo':album.random_photo()})

return render_to_response(template_name, {
     "album_list": album_list,
})
هل كانت مفيدة؟

المحلول

لم أختبر التعليمات البرمجية، لكن هذه هي الفكرة الصحيحة، وينبغي أن يساعدك select_related من تكبدها العديد من استفسارات DB ...

from models import Album, Photo
import random

def get_random():
    albums = Album.objects.select_related().all()
    randpics = []
    for album in albums:
        total = album.photos.count()
        photo = album.photos.get(pk=random.randrange(0,total))
        randpics.append(photo)
    return randpics

نصائح أخرى

يمكنك الحصول على كائن عشوائي واحد من أي queryset باستخدام order_by الطريقة مع علامة استفهام كوسيطة. قد يكون هذا أفضل من الاتصال بالصورة

على سبيل المثال، سيعود هذا الاستعلام صورة عشوائية واحدة:

Photo.objects.order_by('?')[:1]

فيما يلي غير مثالي، لأنه يحتاج إلى استعلام واحد لكل ألبوم، لكنه سيعمل:

photos = []
for a in Album.objects.all():
    photo = a.photos.order_by('?')[:1]
    photos.append(photo)

يحرر:تغيرت [0] مؤشر إلى [:1] لأن السابق سوف يرفع indexerror إذا كان ألبيف لا يحتوي على أي صور.

بدلا من ذلك، في بناء جملة الفهم القائمة:

photos = [a.photos.order_by('?')[:1] for a in Album.objects.all()]
randomPhotos = [random.choice(album.photos.objects.all()) for album in album.objects.all()]

إذا قمت بإجراء طريقة مخصصة في نموذج الألبوم الخاص بك، فإن هذا يبدو مثل هذا:

def random_photo(self):
    import random
    return random.choice(self.photos.all())

سيعود ذلك صورة عشوائية من مثيل الألبوم الحالي IE

albumObj.random_photo()

ملاحظة: رمز غير مختبر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top