zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/10428276.html
Copyright © 2011-2022 走看看