2013-06-21 51 views
0

我有一個數據庫模型這樣的數據庫的新聞項目:從Django中,獲取一定促進筆者

class RssNewsItem(models.Model): 
    title = models.CharField(max_length=512) 
    description = models.TextField() 
    image_url = models.CharField(max_length=512) 
    published = models.DateTimeField(auto_now=True) 
    url = models.CharField(max_length=512, default='') 
    author = models.CharField(max_length=128, default='') 

我想通過選擇其新聞項的3「促進」某個作者和7項其他作者(列出10個新聞項目)並按照-published的順序排列。宣傳新聞項目在名單上的位置是無關緊要的。數字也並不重要。它只是推廣新聞項目的30%的名單。

假設我想宣傳'author1',並且我的網站上有6位作者。

這是可能與Django? (我想避免迭代列表或查詢集)

回答

3
from itertools import chain 
q1 = RssNewItem.objects.filter(author="author1").order_by("-published")[:3] 
q2 = RssNewItem.objects.exclude(author="author1").order_by("-published")[:7] 
q = list(chain(q1, q2)) 

P.這裏是一個很好的SO回答有關合並查詢集:

How to combine 2 or more querysets in a Django view?

  • itertools是快,但顯然結果是一個列表,無法進一步查詢
  • 你可以轉換到列表和添加/擴展: list(q1).extend(list(q2))。與上述相同的問題,速度較慢。
  • 因爲它們是相同的模型,您可以這樣做:q = q1 | q2將它們保留爲QuerySet。
+0

或者你可以做'q1.append(名單(Q2))'因爲它們是同一類型的。這樣你可以取消進口 – karthikr

+0

好點。我會保持原樣,因爲我習慣使用'itertools' –

+0

>>> >>> li = ['a','b','mpilgrim','z','example'] >>> li.extend([「two」,「elements」)) >>> li ['a','b','new','mpilgrim','z','example','new ','two','elements']' – suhailvs

1
class RssNewsItemManager(models.Manager): 
    def get_rsslist_with_promoted(self,auth): 
     prom=self.objects.filter(author=auth).order_by("-published")[:3] 
     unprom=self.objects.exclude(author=auth).order_by("-published")[:7] 
     return prom|unprom 

class RssNewsItem(models.Model): 
    title = models.CharField(max_length=512) 
    description = models.TextField() 
    image_url = models.CharField(max_length=512) 
    published = models.DateTimeField(auto_now=True) 
    url = models.CharField(max_length=512, default='') 
    author = models.CharField(max_length=128, default='') 
    objects = RssNewsItemManager() 
+0

這很有趣,但是我想問這是否可能,因爲不允許添加查詢集,除非'prom'和'unprom'不是查詢集。 – xpanta

+0

return prom | unprom – suhailvs

0

解決方案10項,或任何少數:

qs = RssNewsItem.objects.order_by('-published') 
promoted = list(qs.filter(author=promoted_author)[:count_of_promoted]) 
to_fill = list(qs.exclude(author=promoted_author)[:total_count-len(promoted)]) 
to_return = sorted(promoted + to_fill, key=lambda rni: -rni.published) 
return to_return