django モデル リレーション

ポイント1 親モデルにリレーションを記載する

ER図

親のAK_wordが子モデルの、JP_wordsを持っている

f:id:happy_teeth_ago:20200322001328p:plain

Modelには小モデルを先に記載する

models.ForeignKey(User, unique=True)

この例は、Userの1レコードに対して1つの拡張レコードを対応付けています。 つまり、ユーザID(主キー)が確定すると、ひとつのレコードが決定することを意味します。

models.ForeignKey(User)

この例は、Userの1レコードに対して、複数の拡張レコードが対応付けられます。 つまり、ユーザID(主キー)が確定すると、複数のレコードが抽出されます。

models.ManyToManyField(User)

この例は、複数のUserレコードそれぞれに対して、複数の拡張レコードが対応付けられます

記載例 親Model のAK_words

class AK_words(models.Model):
    jp_word =  models.ForeignKey(JP_words, on_delete=models.CASCADE, null=True)
    en_word = models.ForeignKey(EN_words, on_delete=models.CASCADE,null=True)
    ak_word = models.CharField(max_length=255, null=False)
    renketu = models.BooleanField(null=True)
    pronounce = models.CharField(max_length=255, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  
    def __str__(self):
        return self.ak_word
    class Meta:
        verbose_name_plural = "AK_word"   

Model記載例 子モデルのJP_words,EN_words

class JP_words(models.Model):
    jp_word = models.CharField(max_length=255, null=False)
    
    def __str__(self):
        return self.jp_word
    class Meta:
        verbose_name_plural = "JP_word"

class EN_words(models.Model):
    en_word = models.CharField(max_length=255, null=False)
    
    def __str__(self):
        return self.en_word
    class Meta:
        verbose_name_plural = "EN_word"  

View 記載例 index_akha.html

ループの場所だけ

    {% for ak_word in ak_words %}    
      <div class="word-card">
        <div class="word-container container p-4">
          <ul class="word-container-left">
            <li class="word"><a href="{% url 'show_akha_word' ak_word.id %}">{{ ak_word.ak_word }}</a></li>
            <li class="pronounsation">{{ ak_word.pronounce }}</li>
          </ul>        
          <ul class="word-container-right">

//モデルのリレーションが完了しているので、ak_word.ak_word で取り出せる
            <li class="word-meaning-japanese">{{ ak_word.jp_word }}</li>
            <li class="word-meaning-english">{{ ak_word.en_word }}</li>
          </ul>
        </div>
        <hr class="container">
      </div>      
    {% endfor %}   

当たり前のことだけど、日本語の記事が少なかったので書きました。

めでたし、めでたし