• Anaconda+django写出第一个web app(九)


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

    当我们的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/

  • 相关阅读:
    E
    D
    Npp ChangeLog
    c++ 书籍(zz)
    再好的工作是为了更好的生活
    如何将JPG格式的图片转换成PNG格式
    点分治
    团体程序设计天梯赛(CCCC) L3021 神坛 的一些错误做法(目前网上的方法没一个是对的) 和 一些想法
    团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误
    团体程序设计天梯赛(CCCC) L3015 球队“食物链” 状态压缩
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/10428276.html
Copyright © 2020-2023  润新知