今天来学习外键的使用,用外键来连接数据库中的两个表。

当我们的tutorials非常多的时候,目前的显示方式就会使得页面非常凌乱。我们可以考虑把这些教程分为不同的系列,页面只显示标题以及概要等信息,进一步的我们可以再添加一个类别,比如数据分析、网站开发等等。这样每个类别下有相应的系列,每个系列下有相应的教程。为了实现这一切,我们可以使用外键来连接两个表。

打开main文件夹下的models.py,我们新增两个model:TutorialCategory和TutorialSeries,新增后的models.py内容如下:

from django.db import models
from django.utils import timezone # Create your models here. class TutorialCategory(models.Model):
tutorial_category = models.CharField(max_length=200)
category_summary = models.CharField(max_length=200)
category_slug = models.CharField(max_length=200, default=1) class Meta():
#给出合适的在admin页面显示的复数名称
verbose_name_plural = "Categories" def __str__(self):
return self.tutorial_category class TutorialSeries(models.Model):
tutorial_series = models.CharField(max_length=200)
tutorial_category = models.ForeignKey(TutorialCategory, default=1, verbose_name="Category", on_delete=models.SET_DEFAULT)
series_summary = models.CharField(max_length=200) class Meta():
#给出合适的在admin页面显示的复数名称
verbose_name_plural = "Series" def __str__(self):
return self.tutorial_series class Tutorial(models.Model):
tutorial_title = models.CharField(max_length=200)
tutorial_content = models.TextField()
tutorial_published = models.DateTimeField('date published', default=timezone.now()) tutorial_series = models.ForeignKey(TutorialSeries, default=1, verbose_name="Series", on_delete=models.SET_DEFAULT)
tutorial_slug = models.CharField(max_length=200, default=1) def __str__(self):
return self.tutorial_title

其中我们使用tutorial_category作为外键来连接TutorialCategory和TutorialSeries这两个表格,使用tutorial_series外键来连接Tutorial和TutorialSeries这两个表格。注意要把Tutorial写在最后,因为使用tutorial_series作为外键时,TutorialSeries要已经定义好。

由于我们修改了model,现在必须要进行makemigrations和migrate两步操作:

python manage.py makemigrations
python manage.py migrate

为了让TutorialCategory和TutorialSeries显示在admin页面,我们还需要修改admin.py,修改后内容如下:

from django.contrib import admin
from .models import Tutorial, TutorialCategory, TutorialSeries
from tinymce.widgets import TinyMCE
from django.db import models
# Register your models here.
class TutorialAdmin(admin.ModelAdmin):
fieldsets = [
("Title/Date", {'fields':['tutorial_title', 'tutorial_published']}),
("URL", {'fields':["tutorial_slug"]}),
("Series", {'fields':["tutorial_series"]}),
("Content", {'fields':['tutorial_content']})
]
formfield_overrides = {
models.TextField:{'widget': TinyMCE()},
} admin.site.register(TutorialCategory)
admin.site.register(TutorialSeries)
admin.site.register(Tutorial, TutorialAdmin)

现在进入http://127.0.0.1:8000/admin/,可以看到Categories和Series,点击进去新增一个Category和一个Series。下一节我们通过实例来观察各表之间是如何通过外键来连接的。

参考链接:

[1] https://pythonprogramming.net/foreign-keys-django-tutorial/

Anaconda+django写出第一个web app(九)的更多相关文章

  1. Anaconda+django写出第一个web app(一)

    在安装好Anaconda和django之后,我们就可以开始创建自己的第一个Web app,那么首先创建一个空文件夹,之后创建的文件都在这个文件夹内. 启动命令行进入此文件夹内,可以先通过如下命令查看一 ...

  2. Anaconda+django写出第一个web app(十一)

    今天我们来学习给页面添加一个Sidebar,根据Sidebar跳转到相应的tutorial. 打开views.py,编辑single_slug函数: def single_slug(request, ...

  3. Anaconda+django写出第一个web app(十)

    今天继续学习外键的使用. 当我们有了category.series和很多tutorials时,我们查看某个tutorial,可能需要这样的路径http://127.0.0.1:8000/categor ...

  4. Anaconda+django写出第一个web app(三)

    前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...

  5. Anaconda+django写出第一个web app(二)

    今天开始建立App中的第一个Model,命名为Tutorial. Model的定义在main文件夹下的models.py中通过类进行,我们希望Tutorial这个model包含三个属性:标题.内容和发 ...

  6. Anaconda+django写出第一个web app(七)

    今天来实现如何在页面弹出一些信息,比如注册成功后弹出注册成功的信息.这一点可以通过materialize里的Toasts来实现. django自带的messages可以告诉我们是否注册成功,以及注册失 ...

  7. Anaconda+django写出第一个web app(六)

    今天学习如何写一个注册用户的界面. 上一节的导航栏中我们修改了导航栏右侧的文字为register并将路径设置为/register,内容如下: <li><a href="/r ...

  8. Anaconda+django写出第一个web app(四)

    前面对Models有了一些了解,今天开始进一步了解Views,了解Views如何和Models交互以及了解模板(templates). 打开main文件夹下的views.py,重新编写homepage ...

  9. Anaconda+django写出第一个web app(八)

    今天来实现网站的登入和登出功能. 首先我们需要在urls.py中添加路径,注意此处的路径和在导航栏中设置的文字路径保持一致: from django.urls import path from . i ...

随机推荐

  1. LeetCode 504. Base 7 (C++)

    题目: Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "2 ...

  2. 学习电脑编码utf-8,ansi编码的基础知识等

    大学时期就很好奇,我们所看到的文字在电脑里面是怎么记忆的,感觉不可能是文字本身,今天刚好学习java的io流知识,顺便补充了一下电脑编码知识,先看一下下面小王和小张的例子,然后思考电脑怎么存放文字?  ...

  3. 【助教】浅析log4j的使用

    有不少童鞋私信我一些在写代码时候遇到的问题,但是无法定位问题出在哪里,也没有日志记录,实际上,写日志是开发项目过程中很重要的一个环节,很多问题都可以从日志中找到根源,从而定位到出错位置,为解决问题提供 ...

  4. Visual Studio 2015的安装和简单的测试

    首先是Visual Studio 2015的安装 Visual Studio是微软开发的一套基于组件的软件开发工具,目前最新的版本是2015. 在 I Tell you 网站下载Visual Stud ...

  5. ElasticSearch 2 (2) - Setup

    ElasticSearch 2.1.1 (2) - Setup Installation Elasticsearch can be started using: $ bin/elasticsearc ...

  6. 应对Gradle联网问题、长时间卡在resolve dependencies的思路

    1.出现这种情况,在首先考虑网络问题,依赖下载不下来尝试shadowsocks,未果. 2.检查防火墙问题,更换host,无法解决. 3.新建Gradle工程,依然卡在resolve dependen ...

  7. (改进)Python语言实现词频统计

    需求: 1.设计一个词频统计的程序. 2.英语文章中包含的英语标点符号不计入统计. 3.将统计结果按照单词的出现频率由大到小进行排序. 设计: 1.基本功能和用法会在程序中进行提示. 2.原理是利用分 ...

  8. 使用ejs模板引擎

    let express = require('express'); let fs = require('fs'); let ejs = require('ejs'); let app = expres ...

  9. [置顶网]POWER 9为云与智能打造强大引擎

    POWER 9为云与智能打造强大引擎 关键字: 浪潮商用机器 POWER9 至顶网服务器频道 (文/董培欣): 从全球角度看,政治经济波动持续.逆全球化趋势抬头.技术加速变革商业等因素促使企业需要数字 ...

  10. php 的优缺点

    1.优点:开源 免费性 快捷性 [程序开发快,运行快,技术本身学习快] 插件丰富,网上的解决方案有很多,而且还有庞大的开源社区可以提供帮助. 跨平台性强  效率高   图像处理 面向对象 [在php4 ...