Django - حدد صورة عشوائية من كل ألبوم
-
16-09-2019 - |
سؤال
أحاول الحصول على صورة عشوائية من كل ألبوم من البيانات التي تم إنشاؤها بواسطة 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()
ملاحظة: رمز غير مختبر