django モデル リレーション
ポイント1 親モデルにリレーションを記載する
ER図
親のAK_wordが子モデルの、JP_wordsを持っている
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 %}
当たり前のことだけど、日本語の記事が少なかったので書きました。
めでたし、めでたし