2015-08-03 102 views
-1

我一直在設計一個簡單的書籍推薦系統。所以在註冊時我會要求用戶選擇他們喜歡的流派。每本書也會有一個流派,每種流派都會有一定的權重。在python中設計一個簡單的圖書推薦系統?

假設型號有場Genre_Score(文本字段是與主要的流派和價值爲重JSON格式的字典)像

{"Thriller":5, "Adventure":59,"Biography":21} 

同樣每用戶模型將有Genre_Score像

{"Thriller":1, "Adventure":1,"Biography":2} 

現在每本書完成後,我要求用戶回答我如果他喜歡或不喜歡這本書,並相應地更新該書和用戶的Genre_Score。 正在使用上面的(json格式的文本字段)數據結構的一個好方法? 查詢將非常昂貴,因爲對於每個用戶,我將不得不生成匹配他的Genre_score和Books的流派分數的Feed?或者我應該採取不同的方法嗎?

+0

你使用PostgreSQL?你知道Django沒有內置DictField嗎?另一種方法是將'Genre'模型和從'Book'到'Genre'的ManyToMany分數存儲在穿透模型 – Anentropic

+0

文本字段中,我的意思是JSON格式。對困惑感到抱歉。是的,你提到的另一種方法也是我認爲比這種方法更好嗎? – Coderaemon

+0

如果您將JSON文本存儲在文本字段中,您將無法查詢字典中的特定值 – Anentropic

回答

2

我建議你也喜歡這種模式:

from django.db import models 
from django.contrib.auth.models import AbstractUser 


class Genre(models.Model): 
    name = models.Charfield(max_length=255) 


class BookGenre(models.Model): 
    book = models.ForeignKey('Book') 
    genre = models.ForeignKey('Genre') 
    score = models.IntegerField() 


class Book(models.Model): 
    title = models.CharField(max_length=255) 
    # etc... 
    genres = models.ManyToManyField('Genre', through=BookGenre) 


class UserGenre(models.Model): 
    user = models.ForeignKey('User') 
    genre = models.ForeignKey('Genre') 
    score = models.IntegerField() 


class User(AbstractUser): 
    genres = models.ManyToManyField('Genre', through=UserGenre) 

請參閱該文檔這裏查看更多詳情,比如如何對查詢成績等:

https://docs.djangoproject.com/en/1.8/topics/db/models/#extra-fields-on-many-to-many-relationships

+0

優秀。但爲什麼BookGenre和UserGenre有兩種不同的模型和分數呢?我在想一個簡單的另一個模型體裁與標題和得分?這給了什麼優勢? – Coderaemon

+2

如果將樂譜放在'Genre'模型中,那麼一種流派只能爲所有書籍和用戶提供一個樂譜...在您給它的例子中,似乎您希望每本書都能夠爲每個樂曲擁有自己的樂譜(有道理)和用戶相同 – Anentropic

+0

謝謝。讓我試試這個,然後回來。 – Coderaemon