上文说到已经成功链接MySQL了,并且新建了Django的默认功能表格,本文讲讲新建一些自定义的表格
1,首先编写models文件,用来生成表格的SQL以及操作表格的方法,进入之前创建的Web项目目录polls,修改polls/models.py
from django.db import models # 类名就是表格名称 class Question(models.Model): # 变量名就是字段名,CharField表示字段是char类型 question_text = models.CharField(max_length=200) # DateTimeField就是datetime类型 pub_date = models.DateTimeField('date published') # 对象默认返回内容 def __str__(self): return self.question_text class Choice(models.Model): # 通过外键把Choice关联到Question question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text
2,把polls项目的配置添加到mysite/settings.py,以便初始化时polls包括激活models
INSTALLED_APPS = [ # polls 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
3,初始化polls项目的models,即生成表格的sql,到时会生成文件polls/migrations/0001_initial.py,可通过命令查看具体sql
$ python manage.py makemigrations polls Migrations for 'polls': polls/migrations/0001_initial.py: - Create model Choice - Create model Question - Add field question to choice $ python manage.py sqlmigrate polls 0001 BEGIN; -- -- Create model Choice -- CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL); -- -- Create model Question -- CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime NOT NULL); -- -- Add field question to choice -- ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL; ALTER TABLE `polls_choice` ALTER COLUMN `question_id` DROP DEFAULT; CREATE INDEX `polls_choice_7aa0f6ee` ON `polls_choice` (`question_id`); ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`); COMMIT;
4,接着就是执行sql啦,生成自定义的表格,通过mysql命令查看下新健的自定义表格
$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Rendering model states... DONE Applying polls.0001_initial... OK mysql> show create table polls_choice; +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | polls_choice | CREATE TABLE `polls_choice` ( `id` int(11) NOT NULL AUTO_INCREMENT, `choice_text` varchar(200) NOT NULL, `votes` int(11) NOT NULL, `question_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `polls_choice_7aa0f6ee` (`question_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
5,表格有了,那就试下操作表格添加数据,Django的models类已经集成了丰富数据库操作函数,进入python的命令行测试下
$ python manage.py shell
>>> from polls.models import Question, Choice
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?",pub_date=timezone.now())
>>> q.save()
>>> q.id
1L
>>> q.question_text
"What's new?"
>>> q.question_text="What's up?"
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
>>> q = Question.objects.get(id=1)
>>> q.question_text u"What's up?"
>>> q.choice_set.create(choice_text='Not much',votes=0)
>>> q.choice_set.create(choice_text='The sky',votes=0)
>>> c = q.choice_set.create(choice_text='Just hacking again',votes=0)
>>> c.question
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
Django更多的数据库操作方法参考这里
6,上一篇文章说到了Django的后台,只有默认的admin表格管理,现在把自定义的表格也加进去
$ vim polls/admin.py from django.contrib import admin from .models import Question admin.site.register(Question)
7,重启Django,进入后台页面 http://127.0.0.1:8000/admin/ 登录
$ python manage.py runserver
Leave a Reply