Django模型层(models.py)之模型创建

Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结。

1.ORM简介

  详细介绍可以参考这篇博客:

https://www.cnblogs.com/wgbs25673578/p/5140482.html

  简单的来说,ORM就是对象-关系-映射。它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。

2.创建模型前的准备

  • 在settings中配置databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'myorm_test',	#需要连接的数据库名称
        'USER':'xxx',			#连接数据库的用户名
        'PASSWORD':'xxx',		#用户名对应的密码
        'HOST':'127.0.0.1',		#连接主机,这里是本机
        'PORT':3306				#端口,默认是3306
    }
}
  •  pymysql包的导入

    在setting中导入包pymysql

    

  • 在项目名文件下的__init__.py文件中写入:

  

import pymysql
pymysql.install_as_MySQLdb()

 3.创建模型
  在models.py中新建类

# 图书列表
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    price = models.DecimalField(max_digits=7,decimal_places=2)
    # max_digits:总位数(不包括小数点和符号),decimal_places:小数位数
    publishs = models.ForeignKey(to="publish",on_delete=models.CASCADE,null=True)
    authors = models.ManyToManyField(to="author")
# 出版社列表
class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    addr = models.CharField(max_length=100)
# 作者列表
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)
    country = models.CharField(max_length=20,null=True)
    authordetail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE,null=True)

class AuthorDetail(models.Model):
    id = models.AutoField(primary_key=True)
    # country = models.CharField(max_length=20)
    addr = models.CharField(max_length=100)
    email = models.EmailField()

注意:

  表间关系为多对多时,调用ManyToManyField()方法自动创建第三张表,第三张表中含有三个字段:第三张表的主键,关联第一张表的外键,关联第二张表的外键
  表间关系为一对多时,调用ForeignKey()方法在多的那方创建关联一的那方的外键
       表间关系为一对一时,调用OneToOneField()为两张表建立一对一关系

4.在terminal中执行数据迁移命令

python manage.py makemigrations
python manage.py migrate

 !!!遇到的问题
执行python manage.py makemigrations命令时,报错:

  File "E:PycharmProjectsMyORM_Testvenvlibsite-packagesdjangodbackendsmysqlase.py", line 36, in <module>
    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

 解决:
"E:PycharmProjectsMyORM_Testvenvlibsite-packagesdjangodbackendsmysqlase.py", line 36位置注释掉下列代码:

# if version < (1, 3, 13):
#     raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

 再次执行

python manage.py makemigrations

继续报错:

  File "E:PycharmProjectsMyORM_Testvenvlibsite-packagesdjangodbackendsmysqloperations.py", line 146, in last_executed_query
    query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

 解决:
"E:PycharmProjectsMyORM_Testvenvlibsite-packagesdjangodbackendsmysqloperations.py", line 146位置修改代码如下:

       query = getattr(cursor, '_executed', None)
        if query is not None:
            # query = query.decode(errors='replace')	# 原始代码
            query = query.encode(errors='replace')		# 修改后
        return query

 问题解决。

原文地址:https://www.cnblogs.com/shannen/p/11276615.html