djangoフレームワークの13:外部キー制約


外部キーとテーブルの関係
MySQLでは、テーブルに2つのエンジンがあります.1つはInnoDBで、もう1つはmyisamです.InnoDBエンジンを使用している場合は、外部キーコンストレイントがサポートされます.外部キーの存在により、ORMフレームワークはテーブル関係を処理する際に異常に強力になります.そこでここではまず、Djangoでの外部キーの使用時にエンジンをinnodbに設定する必要があることを紹介します.クラスはclass ForeignKey(to,on_delete,**options)と定義されます.1番目のパラメータはどのモデルを参照するか、2番目のパラメータは外部キーを使用して参照されたモデルデータが削除されました.このフィールドはCASCADE、SET_など、どのように処理されますか.NULLなど.ここでは実例で説明します.たとえばCategoryとArticleの2つのモデルがあります.1つのCategoryには複数の文章があり、1つのArticleには1つのCategoryしかなく、外部キーで参照できます.
外部キーはどこで定義しますか?
一対多の関係については、例えば図書館分類が武侠小説の類に複数の小説を含むが、各小説は1つの分類(図書館の真実のシーン、仮想書は多対多に属し、後で討論する)に1つの武侠小説データは1つの分類しかなく、ここで外部キーを建て、対応する分類に接続することができる.一つの分類には武侠小説が多すぎるので、複数の外部キーを構築することはできません.結論:外部キーは「多」の中にあります.
定義方法
models:

from django.db import models

# Create your models here.
class Category(models.Model):
    name = models.CharField(max_length=20)

class Article(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    category = models.ForeignKey('Category',on_delete=models.CASCADE)
  • 注:CASCADEカスケード削除、外部キーに対応するデータが削除されると、このデータも削除されます.
  • 1 1つのcategoryは複数の文章を持つことができるが、1つのarticleは1つのcategoryでしかなく、この分類を削除し、この文章も
  • 削除される.
    from django.shortcuts import render
    from django.http import HttpResponse
    # Create your views here.
    from .models import Category,Article
    
    def news(request):
        #     
        # category = Category(name='  ')
        # category.save()
        # article = Article(title='   ',content='          ')
        # # #article.category_id = category #    
        # article.category = category
        # article.save()
        article = Article.objects.get(pk=2)
        print(article.category.name)
        return HttpResponse('news    ')
    

    分割コード:データの生成:
        category = Category(name='  ')
        category.save()
        article = Article(title='   ',content='          ')
        # article.category_id = category #    
        article.category = category
        article.save()
    

    データの問合せ、名前の印刷:
        article = Article.objects.get(pk=2)
        print(article.category.name)