djangoのOneToOneFieldでテーブルを作ってみる

2020年12月21日

djangoのOneToOneFieldでテーブルを作ってみる

ツイッター自動化アプリをコツコツ作成しております。
前回までの記事「djangoでツイートを検索して結果を表示してみた」「pythonでtwitterAPIを叩いてダイレクトメッセージを送る」を組み合わせて該当するユーザーのみにダイレクトメッセージを送れるようにしました。ただこのアプリのユーザーは同じツイッターのアカウントを使用するわけではないので、アクセスキーやトークンは個人で用意してもらわなければなりません。今回は「UserInfo」というテーブルを用意して前述の情報を保持するようにしたいと思います。この「UserInfo」と言うテーブルは「UserModel」を拡張するような形になるので「1対1」の関係になります。互いに重複して参照するレコードが無い状態です。

関係性はざっくり下の感じかと思われます。
OneToOne:「生徒の基本情報テーブル」対「生徒の家族情報テーブル」
ForeignKey:「生徒の基本情報テーブル」対「(生徒の)出身地情報テーブル」

ManyToManyもありますがそれは後日にいたします。
それではテーブルを作成していこうと思います。

models.py

OneToOneのテーブルを作成する場合「models.OneToOneField」と記載します。
AUTH_USER_MODELと紐づけるので「settings」をインポートするのも忘れないようにしましょう。


from django.conf import settings
from django.db import models

class UserInfo(models.Model):
    class Meta:
        verbose_name_plural = 'UserInfo'

    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    consumer_key    = models.CharField(max_length=255, blank=True, null=True)
    consumer_secret = models.CharField(max_length=255, blank=True, null=True)
    access_token    = models.CharField(max_length=255, blank=True, null=True)
    access_secret   = models.CharField(max_length=255, blank=True, null=True)
    message         = models.TextField(max_length=1000, blank=True, null=True)
    count_send_message          = models.PositiveIntegerField(default=0, blank=True, null=True)
    count_send_message_in_a_day = models.PositiveIntegerField(default=0, blank=True, null=True)
    count_search_tweet          = models.PositiveIntegerField(default=0, blank=True, null=True)
    count_search_tweet_in_a_day = models.PositiveIntegerField(default=0, blank=True, null=True)
    limit_send_message          = models.PositiveIntegerField(default=0, blank=True, null=True)
    limit_send_message_in_a_day = models.PositiveIntegerField(default=0, blank=True, null=True)

    def __str__(self):
        return str(self.user)

参考:Django __str__ returned non-string (type NoneType)

admin.py

管理画面でも確認できるようにしてあげましょう。


from django.contrib import admin
from .models import UserInfo

admin.site.register(UserInfo)

テーブル確認

テーブルを確認してみます。
紐づきのキー「user_id」が入っているのが確認できますね。


MariaDB [django]> show columns from twitter_userinfo;
+-----------------------------+------------------+------+-----+---------+----------------+
| Field                       | Type             | Null | Key | Default | Extra          |
+-----------------------------+------------------+------+-----+---------+----------------+
| id                          | int(11)          | NO   | PRI | NULL    | auto_increment |
| customer_key                | varchar(255)     | YES  |     | NULL    |                |
| customer_secret             | varchar(255)     | YES  |     | NULL    |                |
| access_token                | varchar(255)     | YES  |     | NULL    |                |
| access_secret               | varchar(255)     | YES  |     | NULL    |                |
| message                     | longtext         | YES  |     | NULL    |                |
| count_send_message          | int(10) unsigned | YES  |     | NULL    |                |
| count_send_message_in_a_day | int(10) unsigned | YES  |     | NULL    |                |
| count_search_tweet          | int(10) unsigned | YES  |     | NULL    |                |
| count_search_tweet_in_a_day | int(10) unsigned | YES  |     | NULL    |                |
| limit_send_message          | int(10) unsigned | YES  |     | NULL    |                |
| limit_send_message_in_a_day | int(10) unsigned | YES  |     | NULL    |                |
| user_id                     | int(11)          | NO   | UNI | NULL    |                |
+-----------------------------+------------------+------+-----+---------+----------------+

関連のある書籍

2020年12月21日