<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg) ## 外鍵和表關系 在MySQL中,表有兩種引擎,一種是InnoDB,另外一種是myisam。如果使用的是InnoDB引擎,是支持外鍵約束的。外鍵的存在使得ORM框架在處理表關系的時候異常的強大。因此這里我們首先來介紹下外鍵在Django中的使用。 類定義為class ForeignKey(to,on_delete,**options)。第一個參數是引用的是哪個模型,第二個參數是在使用外鍵引用的模型數據被刪除了,這個字段該如何處理,比如有CASCADE、SET_NULL等。這里以一個實際案例來說明。比如有一個Category和一個Article兩個模型。一個Category可以有多個文章,一個Article只能有一個Category,并且通過外鍵進行引用。 ``` class Category(models.Model): name = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() # author = models.ForeignKey("User",on_delete=models.CASCADE) category = models.ForeignKey("Category",on_delete=models.CASCADE) ``` 以上使用ForeignKey來定義模型之間的關系。即在article的實例中可以通過author屬性來操作對應的User模型。這樣使用起來非常的方便。 ``` from django.shortcuts import render from django.http import HttpResponse from .models import Article,Category # Create your views here. def index(request): category = Category(name="news") category.save() article = Article(title='PHP',content='123') article.category = category article.save() article = Article.objects.first() # 獲取文章分類名稱 article = Article.objects.first() print(article.category.name) ``` 為什么使用了ForeignKey后,就能通過author訪問到對應的user對象呢。因此在底層,Django為Article表添加了一個屬性名_id的字段(比如author的字段名稱是author_id),這個字段是一個外鍵,記錄著對應的作者的主鍵。以后通過article.author訪問的時候,實際上是先通過author_id找到對應的數據,然后再提取User表中的這條數據,形成一個模型。 如果想要引用另外一個app的模型,那么應該在傳遞to參數的時候,使用app.model_name進行指定。以上例為例,如果User和Article不是在同一個app中 ``` # User模型在user這個app中 class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) # Article模型在article這個app中 class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() author = models.ForeignKey("user.User",on_delete=models.CASCADE) ``` 如果模型的外鍵引用的是本身自己這個模型,那么to參數可以為'self',或者是這個模型的名字。在論壇開發中,一般評論都可以進行二級評論,即可以針對另外一個評論進行評論,那么在定義模型的時候就需要使用外鍵來引用自身 ``` class Comment(models.Model): content = models.TextField() origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True) # 或者 # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True) ``` ### 外鍵刪除操作 ``` 如果一個模型使用了外鍵。那么在對方那個模型被刪掉后,該進行什么樣的操作。可以通過on_delete來指定。可以指定的類型如下: 1.CASCADE:級聯操作。如果外鍵對應的那條數據被刪除了,那么這條數據也會被刪除。 2.PROTECT:受保護。即只要這條數據引用了外鍵的那條數據,那么就不能刪除外鍵的那條數據。 3.SET_NULL:設置為空。如果外鍵的那條數據被刪除了,那么在本條數據上就將這個字段設置為空。如果設置這個選項,前提是要指定這個字段可以為空。 4.SET_DEFAULT:設置默認值。如果外鍵的那條數據被刪除了,那么本條數據上就將這個字段設置為默認值。如果設置這個選項,前提是要指定這個字段一個默認值。 5.SET():如果外鍵的那條數據被刪除了。那么將會獲取SET函數中的值來作為這個外鍵的值。SET函數可以接收一個可以調用的對象(比如函數或者方法),如果是可以調用的對象,那么會將這個對象調用后的結果作為值返回回去。 6.DO_NOTHING:不采取任何行為。一切全看數據庫級別的約束。 ``` **以上這些選項只是Django級別的,數據級別依舊是RESTRICT!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看