Python中模型的创建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37462976/article/details/79741856

一,第一个模型---Books


之前用命令行创建了一个叫books的应用程序,现在需要给这个模块添加“骨骼”和“肌肉”。

“骨骼”就是模型--->需要声明这个模块的基本构成组件

“肌肉”算是页面--->都写在了view.py中了

首先,书这个物品要有作者来写,写完之后需要有出版社来发行,作者有姓名,email,头像等

出版社有名称,地址,所在城市,省,国家,网站等

书有书名和出版日期

现在用代码来描述:

这些是在我们刚建立的Books那个模块下的models.py中写的

from django.db import models

# Create your models here.

#以下的每个数据模型都是django.db.models.Model的子类,父类Model包含了所有和数据库打交道的方法
#每个模型相当于单个数据库表,每个属性也是这个表中的一个字段,属性名就是字段名
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    countray = models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    salutation = models.CharField(max_length=10)
    first_name = models.CharField(max_length=30)
    email = models.CharField(max_length=40)
    headshot = models.ImageField(upload_to='/tmp')

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

大家注意到了,Book类中有一个是models.ManayToManyField(Author)的声明,这说明,一本书可能对应多个作者

最后需要注意的是我们没有给这些类定义主键,Django会自动为没有添加主键的类自动添加一个叫做“id”的主键,每个Django模型必须有一个单列主键

二,模型安装

写完代码之后,需要在数据库中创建表。第一步是要在Django项目中激活这些模型。将books app添加到配置文件的已installed apps列表中即可:编辑settings.py文件,找到INSTALLED_APPS设置INSTALLED_APPS告诉Django项目哪些app处于激活状态。缺省状态如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

把需要激活的books apps放到列表中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'untitled.books',
]
现在就可以创建数据库表了。首先需要使用:python manage.py validate来验证一下我们模型的有效性:

额。。。我的出现问题了:

(venv) D:\untitled>python manage.py validate
Traceback (most recent call last):
  File "D:\untitled\venv\lib\site-packages\django\apps\config.py", line 118, in create
    cls = getattr(mod, cls_name)
AttributeError: module 'untitled' has no attribute 'books'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "D:\untitled\venv\lib\site-packages\django\core\management\__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "D:\untitled\venv\lib\site-packages\django\core\management\__init__.py", line 347, in execute
    django.setup()
  File "D:\untitled\venv\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\untitled\venv\lib\site-packages\django\apps\registry.py", line 89, in populate
    app_config = AppConfig.create(entry)
  File "D:\untitled\venv\lib\site-packages\django\apps\config.py", line 123, in create
    import_module(entry)
  File "D:\untitled\venv\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'untitled.books'

从结果来看,貌似是找不到untitled.books这个模型。。不会吧。。
我项目的结构有问题吗?


从网上搜了一下,结果发现是python的版本问题(版本问题也可能导致命令行不能使用,我用的python manage.py validate发现命令行无效,使用python manage.py check就好了

因为版本问题,我们INSTALLED_APPS就不能那么写了,需要这样:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'books',
]

然后又出现一个问题:

ERRORS:
books.Author.headshot: (fields.E202) ImageField's 'upload_to' argument must be a relative path, not an absolute path.
        HINT: Remove the leading slash.
books.Author.headshot: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install Pillow".

问题是ImageField这个模块没安装。。

用pip命令安装一下,具体命令行可以上网上看看

结果还有个问题:

File "D:\untitled\books\models.py", line 24, in Book
    publisher = models.ForeignKey(Publisher)
TypeError: __init__() missing 1 required positional argument: 'on_delete'

这是需要给外键关键字中添加on_deletet关键字


然后运行python manage.py check,还是有问题啊:

ImageField's 'upload_to' argument must be a relative path, not an absolute path.
        HINT: Remove the leading slash.

这个问题我自己摸索这改了一下:他要相对路径,那就给个相对路径,然后,正确的models.py给一下(当前python版本中):

from django.db import models

# Create your models here.

#以下的每个数据模型都是django.db.models.Model的子类,父类Model包含了所有和数据库打交道的方法
#每个模型相当于单个数据库表,每个属性也是这个表中的一个字段,属性名就是字段名
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    countray = models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    salutation = models.CharField(max_length=10)
    first_name = models.CharField(max_length=30)
    email = models.CharField(max_length=40)
    headshot = models.ImageField(upload_to='tmp')

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE,)
    publication_date = models.DateField()

(我也是根据教程一边试一边写博客,出现问题解决一下也是挺爽的,聚沙成塔嘛!)


然后执行一下python manage.py check :System check identified no issues (0 silenced).

这说明我们的模型创建的没什么问题了。


然后执行 python manage.py migrate 命令:

No migrations to apply.
报了个这个,出现这个的时候

执行一下这两个命令行:

python manage.py makemigrations
   python manage.py migrate

没问题的话会出现:

Migrations for 'books':
  books\migrations\0001_initial.py
    - Create model Author
    - Create model Book
    - Create model Publisher
    - Add field publisher to book

(venv) D:\untitled>python manage.py migrate
Operations to perform:
  Apply all migrations: books
Running migrations:
  Applying books.0001_initial... OK

同时books这个模块下会出现:



0001_initial.py文件,这个文件中记录着所建表的字段和属性


然而问题来了,既然创建好了表,那么表在哪里?没看见啊,我打开mysql,因为不经常用mysql,现在做的项目是oracle,mysql中没几个库,所有的查看了一下,都没看到有和这个项目相关的表。。。


后来上网上查看了一下,python怎么连接数据库。发现settings中有这样一个变量:


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'books',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': 'root', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

我的不是这样的,这是后来改的,在改的时候还出现了很多问题,books这个数据库中应该有我生成的表,按照以上的配置试了一下(最后执行python manage.py migrate命令出现问题):

ModuleNotFoundError: No module named 'MySQLdb'

是我没安装这个模块?我执行了一下pip install MySQL,发现早已经安装了。。

于是上网上搜索了一下:

http://imshusheng.com/python/216.html

解决了。

大体上就是:

1.

pip install mysql-python
2.

pip install PyMySQL
3.在unitlled的__init__py下加上:

import pymysql
pymysql.install_as_MySQLdb()

最后在运行一下python manage.py migrate,在看一下数据库


终于出现这几张表了。


好了,这篇就先介绍这些(最后github地址:https://github.com/phoenix12345/python_pritice)


展开阅读全文

没有更多推荐了,返回首页