2015-08-03 56 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