gpt4 book ai didi

python - Django 查询集自定义顺序与指定位置上的一些对象

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:42 25 4
gpt4 key购买 nike

我有模型:

class Article(models.Model):
site = models.ForeignKey('Site')
published_at = models.DateTimeField(_('Published at'))
promoted = models.BooleanField(_('Promoted'))
position = models.PositiveSmallIntegerField(
_('Position'),
null=True,
blank=True,
)
valid_from = models.DateTimeField(_('Valid from'))
valid_to = models.DateTimeField(_('Valid to'))
// (...)

我想获取指定时间范围内某些对象的指定位置的查询集。其余的应在 发布 日期之前订购。

我现在做的方式可行,但速度慢且效率低,这是一个问题,因为我想在主页上使用它。

def get_articles_list(site):
articles = Article.objects.filter(
site=site,
published_at__lte=now(),
).order_by(
'-published_at',
)

promoted_articles = Article.objects.filter(
site=site,
promoted=True,
valid_from__lte=now(),
valid_to__gte=now(),
position__isull=False,
)

// create a list with no promoted articles on it (to avoid duplicates)
articles_list = list(articles.exclude(id__in=promoted_articles))

// put promoted articles on the specific positions of the list
if promoted_articles:
for promoted in promoted_articles:
articles_list.insert(promoted.position - 1, promoted)
return articles_list

有没有办法优化流程?

更新

例如我有五个 Article 对象:

article_1
site: 1
published_at: 2018-04-01
promoted: True
position: 4
valid_from: 2018-04-01
valid_to: <tomorrow>
article_2
site: 1
published_at: 2018-04-02
promoted: False
position: -
valid_from: -
valid_to: -
article_3
site: 1
published_at: 2018-04-03
promoted: False
position: -
valid_from: -
valid_to: -
article_4
site: 1
published_at: 2018-04-04
promoted: False
position: -
valid_from: -
valid_to: -
article_5
site: 1
published_at: 2018-04-05
promoted: True
position: 2
valid_from: 2018-04-05
valid_to: <tomorrow>

我要实现的顺序是:[article_4、article_5、article_3、article_1、article_2]

最佳答案

我建议您添加一些中间件方法,根据一些自定义逻辑计算每个条目的权重 - 您需要定义哪些参数将使条目在列表的前面得到更多提升,哪些是中性的。

我认为这就是(或多或少)像 Algolia 这样的搜索服务的工作方式(或者只是它们的一部分功能),您可以在其中定义哪种“分数”乘数具有来自您的数据库的一些参数。

(抱歉没有实际的 Python 代码,但我不是每天都使用它 - 只是想在一般解决方案概念上提供帮助)

关于python - Django 查询集自定义顺序与指定位置上的一些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49977576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com