图书推荐系统(五)之数据导入到数据库

将获取的数据保存到数据库中

1、准备user的数据导入

(1)prepare.py

# -*- coding: utf-8 -*-
"""
    Author: JinHelen
    Date:2019-04-21
    Desc:准备user的数据导入mysql
"""

import os,django
#存放所有的环境变量,目的是为了任何一个django project中的*.py文件都能够正常的使用项目中的数据模型操作
os.environ["DJANGO_SETTINGS_MODULE"]="Book.settings"
django.setup()
"""
 上边import 解决错误:
 django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not 
 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
"""
from user.models import User

user_path = "../data/select_users.txt"

pwd = "123456"

for line in open(user_path,"r"):
    uname = line.strip()
    User(username=uname,password=pwd,isnewuser=False).save()
    print("User 信息导入数据库完成,密码全部初始化为123456,是否是新注册用户初始化为False!")

(2)index/models.py

#-*- coding: utf-8 -*-

from django.db import models

# Create your models here.

class User(models.Model):
    # 用户名和密码
    # blank=True,那么 Django 的管理后台就允许该字段填写空值;verbose_name:提供自述名
    username = models.CharField(blank=True,verbose_name="用户名",unique=True,max_length=20)
    password = models.CharField(blank=True,verbose_name="密码",max_length=6,default="123456")
    regtime = models.DateTimeField(verbose_name="注册时间",auto_now=True)
    isnewuser = models.BooleanField(blank=True,verbose_name="是否注册用户",default=True)

    # 输出object调用str()时应返回的值
    def __str__(self):
        return self.username
    #定义模型的元数据(任何不是字段的数据),里面的选项不是必须的
    class Meta:
        #该模型所使用的数据库表的名称
        db_table = 'user'
        #该对象复数形式的名称
        verbose_name_plural = "用户表"

2、准备book的数据导入mysql

(1)prepare_book_mess.py

# -*- coding: utf-8 -*-
"""
    Author: JinHelen
    Date:2019-04-15
    Desc:准备book的数据导入mysql
"""
import os,django
os.environ["DJANGO_SETTINGS_MODULE"]="Book.settings"
django.setup()
"""
 上边import 解决错误:
 django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not 
 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
"""

from index.models import Book
# 图书信息表
book_mess_pass = "../data/book_mess.txt"

# 写入数据库
_have_write_ids = list()
for line in open(book_mess_pass,"r",encoding='utf-8'):
    bookid,bookname,bookimg,bookscore,booktag = line.strip().split("\t")
    if bookscore == "":
        bookscore = 1.0
    else:
        bookscore = float(bookscore)
    #爬取过程中数据有重复
    if bookid in _have_write_ids:
        print("该图书信息({})已经写入数据库".format(bookid))
        continue
    else:
        Book(bookid=bookid, bookname=bookname, bookimg = bookimg, bookscore=bookscore, booktag=booktag).save()
        _have_write_ids.append(bookid)
print("图书信息写入数据库完成!")

(2)index/models.py

# -*- conding:utf-8 -*-

from django.db import models

# Create your models here.

# 图书信息类
"""
4758387	并州迷雾	https://img1.doubanio.com/view/subject/l/public/s4377217.jpg	7.4	狄仁杰,推理,悬疑,小说,安娜芳芳,中国,同人作品,神探狄仁杰
"""
class Book(models.Model):
    bookid = models.CharField(blank=True, verbose_name="图书ID", unique=True, max_length=20)
    bookname = models.CharField(blank=True, verbose_name="图书名字", max_length=100)
    bookimg = models.CharField(blank=False, verbose_name="图书封面链接", max_length=300)
    bookscore = models.FloatField(blank=False, verbose_name="图书评分", default=1.0)
    booktag = models.CharField(blank=True, verbose_name="图书标签", unique=False, max_length=400)

    def __str__(self):
        return self.bookname

    def tag_split(self):
        return self.booktag.split(",")

    class Meta:
        db_table = "bookmess"
        verbose_name_plural = "图书信息表"

# 图书评分表
class BookScore(models.Model):
    userid = models.CharField(blank=True, verbose_name="用户ID", max_length=20)
    bookid = models.CharField(blank=True, verbose_name="图书ID", max_length=20)
    bookscore = models.FloatField(blank=True, verbose_name="用户对图书的评分")
    actiontime = models.DateTimeField(verbose_name="评分时间", auto_now=True)

    def __str__(self):
        return self.userid

    class Meta:
        db_table = 'bookscore'
        verbose_name_plural = "图书评分表"

3、生成迁移