zoukankan      html  css  js  c++  java
  • 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
    

     问题解决。

  • 相关阅读:
    SQL Server 2012本地发布、订阅及相关问题的解决方案
    微信小程序——try {} catch (e) {}
    C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法
    功能测试--H5测试点
    功能测试--指纹识别测试点
    功能测试--二维码测试点
    功能测试--登录测试点
    功能测试--计步测试点
    功能测试--投票测试点
    功能测试--签到测试点
  • 原文地址:https://www.cnblogs.com/shannen/p/11276615.html
Copyright © 2011-2022 走看看