0

我有一个这样的数据库模型:

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可以做到这一点吗?(我想避免遍历列表或查询集)

4

3 回答 3

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))

Ps 这是关于合并查询集的一个很好的 SO 答案:

如何在 Django 视图中组合 2 个或更多查询集?

  • itertools 速度很快,但显然结果是一个列表,无法进一步查询
  • 您可以转换为列表并附加/扩展:list(q1).extend(list(q2))。与上述相同的问题并且速度较慢。
  • 由于它们是相同的模型,您可以这样做:q = q1 | q2将它们保留为 QuerySet。
于 2013-06-21T10:10:14.060 回答
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()
于 2013-06-21T10:14:24.157 回答
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
于 2013-06-21T10:14:35.330 回答