簡體   English   中英

Django 模型和多對多關系——找到最相似的對象

[英]Django Model and Many-to-Many Relationships — finding most similar objects

我遇到了一個找不到解釋的問題。

給定一個對象(在這種情況下,“文章”),我想使用另一種類型的對象(在這種情況下,“類別”)來確定哪些其他文章與文章 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 模型聚合來匹配這個邏輯並且只運行一個查詢。 我很清楚。 如果可能,更願意在框架內進行。 有沒有人有這方面的指示?

現在我已經在模型框架中找到了一種方法來做到這一點。

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,並且可以這樣排序。

我認為如果你真的想過濾所有類別的文章,正確的答案應該是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM