一,第一个模型---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 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
pip install PyMySQL
import pymysql pymysql.install_as_MySQLdb()
最后在运行一下python manage.py migrate,在看一下数据库
终于出现这几张表了。
好了,这篇就先介绍这些(最后github地址:https://github.com/phoenix12345/python_pritice)