You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.7 KiB
143 lines
3.7 KiB
6 months ago
|
from django.db import models
|
||
|
from django.db.models import Avg
|
||
|
|
||
|
|
||
|
class Genre(models.Model):
|
||
|
name = models.CharField(max_length=100,verbose_name="类型")
|
||
|
|
||
|
class Meta:
|
||
|
db_table='Genre'
|
||
|
verbose_name='电影类型'
|
||
|
verbose_name_plural='电影类型'
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.name
|
||
|
|
||
|
|
||
|
class Movie(models.Model):
|
||
|
name=models.CharField(max_length=256,verbose_name="电影名")
|
||
|
imdb_id = models.IntegerField(verbose_name="imdb_id")
|
||
|
time=models.CharField(max_length=256,blank=True,verbose_name="时长")
|
||
|
genre =models.ManyToManyField(Genre,verbose_name="类型")
|
||
|
release_time=models.CharField(max_length=256,blank=True,verbose_name="发行时间")
|
||
|
intro=models.TextField(blank=True,verbose_name="简介")
|
||
|
director=models.CharField(max_length=256,blank=True,verbose_name="导演")
|
||
|
actor=models.CharField(max_length=256,blank=True,verbose_name="演员")
|
||
|
writers=models.CharField(max_length=256,blank=True,verbose_name="编剧")
|
||
|
movie_similarity=models.ManyToManyField('self',through="Movie_similarity",symmetrical=False,verbose_name="相似电影")
|
||
|
|
||
|
|
||
|
class Meta:
|
||
|
db_table='Movie'
|
||
|
verbose_name='电影信息'
|
||
|
verbose_name_plural='电影信息'
|
||
|
|
||
|
def __str__(self):
|
||
|
return f"<Movie:{self.name},{self.imdb_id}>"
|
||
|
|
||
|
|
||
|
def get_score(self):
|
||
|
result_dct=self.movie_rating_set.aaggregate(Avg('score'))
|
||
|
try:
|
||
|
result=round(result_dct['score__avg'],1)
|
||
|
except TypeError:
|
||
|
return 0
|
||
|
else:
|
||
|
return result
|
||
|
|
||
|
def get_user_score(self,user):
|
||
|
return self.movie_rating_set.filter(user=user).values('score')
|
||
|
|
||
|
def get_score_int_range(self):
|
||
|
return range(int(self.get_score()))
|
||
|
|
||
|
def get_genre(self):
|
||
|
genre_dct=self.genre.all().values('name')
|
||
|
genre_lst=[]
|
||
|
for dct in genre_dct.values():
|
||
|
genre_lst.append(dct['name'])
|
||
|
return genre_lst
|
||
|
|
||
|
|
||
|
def get_similarity(self,k=5):
|
||
|
similarity_movies=self.movie_similarity.all()[:k]
|
||
|
return similarity_movies
|
||
|
|
||
|
class Movie_similarity(models.Model):
|
||
|
movie_source=models.ForeignKey(Movie,related_name='movie_source',on_delete=models.CASCADE)
|
||
|
movie_target=models.ForeignKey(Movie,related_name='movie_target',on_delete=models.CASCADE)
|
||
|
similarity=models.FloatField(verbose_name="相似度")
|
||
|
|
||
|
class Meta:
|
||
|
verbose_name='电影相似度'
|
||
|
verbose_name_plural='电影相似度'
|
||
|
|
||
|
|
||
|
class User(models.Model):
|
||
|
name=models.CharField(max_length=128,unique=True,verbose_name="用户名")
|
||
|
password=models.CharField(max_length=256,verbose_name="密码")
|
||
|
email=models.EmailField(unique=True,verbose_name="邮箱")
|
||
|
rating_movies=models.ManyToManyField(Movie,through="Movie_rating")
|
||
|
|
||
|
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.name
|
||
|
|
||
|
class Meta:
|
||
|
db_table='Usser'
|
||
|
verbose_name='用户信息'
|
||
|
verbose_name_plural='用户信息'
|
||
|
|
||
|
class Movie_rating(models.Model):
|
||
|
user = models.ForeignKey(User, on_delete=models.CASCADE, unique=False, verbose_name="用户")
|
||
|
movie=models.ForeignKey(Movie,on_delete=models.CASCADE,unique=False,verbose_name="电影")
|
||
|
score=models.FloatField(verbose_name="评分")
|
||
|
comment=models.TextField(blank=True,verbose_name="评论")
|
||
|
|
||
|
class Meta:
|
||
|
db_table='Movie_rating'
|
||
|
verbose_name='电影评分信息'
|
||
|
verbose_name_plural='电影评分信息'
|
||
|
|
||
|
class Movie_hot(models.Model):
|
||
|
movie = models.ForeignKey(Movie, on_delete=models.CASCADE, verbose_name="电影名")
|
||
|
rating_number = models.IntegerField(verbose_name="评分人数")
|
||
|
|
||
|
|
||
|
|
||
|
class Meta:
|
||
|
db_table='Movie_hot'
|
||
|
verbose_name='最热电影'
|
||
|
verbose_name_plural='最热电影'
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|