SORU
10 Ocak 2009, CUMARTESİ


Django nasıl bir görünüm içinde 2 ya da daha fazla querysets birleştirmek için?

Yapıyorum Django bir site için arama yapmak için çalışıyorum, ve arama 3 farklı model arıyorum. Ve sayfa numaralandırması için arama sonucu listesinde sonuçlarını görüntülemek için genel object_list bir görünüm kullanmak istiyorum. Ama 3 birleştirmek için ben bunu yapmak için bir querysets.

Bunu nasıl yapabilirim? Ive bu çalıştı:

result_list = []            
page_list = Page.objects.filter(Q(title__icontains=cleaned_search_term) | Q(body__icontains=cleaned_search_term))
article_list = Article.objects.filter(Q(title__icontains=cleaned_search_term) | Q(body__icontains=cleaned_search_term) | Q(tags__icontains=cleaned_search_term))
post_list = Post.objects.filter(Q(title__icontains=cleaned_search_term) | Q(body__icontains=cleaned_search_term) | Q(tags__icontains=cleaned_search_term))

for x in page_list:
    result_list.append(x)
for x in article_list:
    result_list.append(x)
for x in post_list:
    result_list.append(x)

return object_list(request, queryset=result_list, template_object_name='result',
                   paginate_by=10, extra_context={'search_term': search_term},
                   template_name="search/result_list.html")

Ama bu gerçekleri genel görünümü bu listeyi kullanmaya çalıştığımda bir hata alıyorum işe. Liste klon özniteliği eksik.

Herkes üç listeleri, page_list, article_list birleştirme nasıl yapacağımı ve post_list?

CEVAP
12 Ocak 2009, PAZARTESİ


Bir liste haline querysets bitiştirmek basit bir yaklaşımdır. Eğer veritabanı tüm querysets neyse (sonuç sıralanması gerekiyor çünkü örneğin) için vurulacak olursa, bu da maliyeti eklemez.

from itertools import chain
result_list = list(chain(page_list, article_list, post_list))

itertools.chain itertools ayrıca bitiştirmek önce bir liste halinde her queryset dönüştürme daha az bellek tüketir C. uygulanan bu yana her liste döngü ve elemanları tek tek ekleme daha hızlıdır.

Şimdi Olası sonuç listesi tarih hasen bir cevap j yorum olarak istenen () örneğin sıralamak için. sorted() işlevi uygun bir jeneratör kabul eder ve bir liste verir:

result_list = sorted(
    chain(page_list, article_list, post_list),
    key=lambda instance: instance.date_created)

Eğer Python 2.4 veya üstü kullanıyorsanız, bir lambda yerine attrgetter kullanabilirsiniz. Bu konuda okuma daha hızlı olduğunu hatırlıyorum, ama milyon öğe listesi için belirgin bir hız farkı görmedim.

from operator import attrgetter
result_list = sorted(
    chain(page_list, article_list, post_list),
    key=attrgetter('date_created'))

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Awesomesauce Network

    Awesomesauce

    4 EKİM 2012
  • Hudson Music

    Hudson Music

    13 Mart 2007
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006