Django模型和多对多关系 - 找到最相似的对象

时间:2014-05-16 03:08:47

标签: python django model

我遇到了一个无法找到解释的问题。

给定一个对象(在这种情况下,"文章"),我想使用另一种类型的对象(在这种情况下,"类别")来确定哪些其他文章与第X条最相似,通过它们共同的类别数量来衡​​量。文章和类别之间的关系是多对多的。用例是获取相关对象的快速列表,以显示为链接。

我确切地知道如何手工编写SQL:

select 
    ac.article_id
from 
    Article_Category ac
where
    ac.category_id in 
    (
        select
            category_id
        from
            Article_Category
        where
            article_id = 1  -- get all categories for article in question
    )
    and ac.article_id <> 1
group by 
    ac.article_id
order by 
    count(ac.category_id) desc, random() limit 5

我正在努力解决的问题是如何使用Django模型聚合来匹配此逻辑并仅运行一个查询。我是obv。如果可能的话,我更愿意在框架内完成。有没有人指点这个?

2 个答案:

答案 0 :(得分:2)

现在添加它,我已经在模型框架中找到了一种方法来实现这一目标。

related_article_list = Article.objects.filter(category=self.category.all())\
                       .exclude(id=self.id)
related_article_ids = related_article_list.values('id')\
                      .annotate(count=models.Count('id'))\
                      .order_by('-count','?')

在related_article_list部分中,将分别包含与2个或更多类别匹配的其他文章对象。因此,当使用注释来计数它们时,数字将是> 1,他们可以这样订购。

答案 1 :(得分:0)

如果你真的想过滤所有类别的文章,我认为正确的答案应该是这样的:

related_article_list = Article.objects.filter(category__in=self.category.all())\
                       .exclude(id=self.id)