Django Timestampモデル(クラス継承)


Djangoでデータモデルを作成する場合、学習中に重複するフィールドを作成し続けるのは不便です.そこで,classの継承機能によりオーバーラップモデルのフィールドをモジュール化しようとする.
models.py (users)
class User(models.Model):
    name         = models.CharField(max_length=100)
    email        = models.EmailField(max_length=245, unique=True)
    password     = models.CharField(max_length=200)
    phone_number = models.CharField(max_length=200)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)

    class Meta: 
        db_table = "users"
models.py(postings)
class Post(models.Model):
    user =  models.ForeignKey(User, on_delete=(models.CASCADE), related_name= "posts")
    text =  models.TextField(null=True)
    
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table =  "posts"

class Image(models.Model):
    image_url = models.URLField(max_length=2000)
    post      = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="images")

    class Meta:
        db_table = "images"

class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="comments")
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")
    text = models.TextField()

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "comments"
上記のusersアプリケーションとpostingsアプリケーションのデータモデルによれば、データ生成時間を自動的に入力するcreated atフィールドと、データ修正時間を自動的に入力するupdated atフィールドが重なり続けることがわかります.
だから私はまずutilsソフトを使います(調べてみると、普通はcoreというソフトでやっています.)utils appモデルにcreated at、updated atfieldを持つTimestampZoneというモデルが作成されました.
models.py(utils)作成したTimeStampZoneデータモデル
from django.db import models

class TimestampZone(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
このように、継承のために作成されたデータモデルは、継承しようとするデータモデル(TimestampZone)が継承しようとするデータベースに入らずにフィールドを正しく継承するために、メタデータクラスで=Trueを破棄する必要があります.
私はどうやってこれを知ったのか、私も知りたくありません.
上で作成したTimeStampZoneモデルを用いて,元に作成したアプリケーションのデータモデルを書き直した.
models.py(users)
from utils.models import TimestampZone

class User(TimestampZone):
    name         = models.CharField(max_length=200)
    email        = models.CharField(max_length=200, unique=True)
    password     = models.CharField(max_length=2000)
    phone_number = models.CharField(max_length=200)
    
    class Meta:
        db_table = "users"
models.py(postings)
from users.models import User
from utils.models import TimestampZone

class Post(TimestampZone):
    user    = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
    content = models.TextField(null=True)
    
    class Meta:
        db_table = "posts"

class Image(TimestampZone):
    image_url = models.CharField(max_length=2000)
    post      = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="images")
    
    class Meta:
        db_table = "images"

class Comments(TimestampZone):
    user    = models.ForeignKey(User, on_delete=models.CASCADE, related_name="comments")
    post    = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")
    content = models.CharField(max_length=2000)

    class Meta:
        db_table = "comments"
フィールドを繰り返すことなく、簡潔なデータモデルを作成できます.
完了したデータモデルの構造(正しいフィールドが表示されます).