我一直在为书籍设计一个简单的推荐系统。所以在注册时我会要求用户选择他们喜欢的类型。每本书也会有一个类型加上每个类型都有一个权重。
假设 Book 模型有一个字段 Genre_Score (一个文本字段是json格式的字典,其中key为类型,值为权重)类似
{"Thriller":5, "Adventure":59,"Biography":21}
同样,每个用户模型都会有类似
的Genre_Score{"Thriller":1, "Adventure":1,"Biography":2}
现在,每本书完成后,我都会要求用户回答他是否喜欢这本书,并相应地更新该书和用户的 Genre_Score 。 使用上面的(json格式的文本字段)数据结构是一个好方法吗? 查询会非常昂贵,因为每个用户都必须生成与他的Genre_score和Books的流派分数匹配的 Feed 吗?或者我应该采取不同的方法吗?
答案 0 :(得分: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