プロジェクト:WASH Corporationモデリング


上記のコードの最初の項目


1.日常会議


会議の内容

  • 「製品詳細」ページで購入数量を決定できますが、ERD製品にこの数量がない理由は何ですか?
    →カート(カート)に数欄あり
        実際、Market Colleyページでは、製品ページ-カート間を移動して確認しています.
        製品ページ内では、購入数に関する個別の内容はなく、ショッピングバスケットに入るときに発生するものを見ることができます

  • 「製品リスト」ページで新製品ソート基準の新製品ソートを実施するには、製品に関連コンテンツが含まれるかどうか(ex.Is new:True/Felse)
    →製品とMany to Manyの関係がつながっているTagsにはNEWという新製品のラベルが含まれており、それに対応した内容で実現できる
  • 2.モデリング


    ERDに基づいて,ユーザ,製品,carts,wishsには4つのappのモデルがある.pyの作成


    users/models.py

    from django.db import models
    
    class User(models.Model):
        user_id  = models.CharField(max_length=40)
        password   = models.CharField(max_length=200)
        name       = models.CharField(max_length=40)
        nickname   = models.CharField(max_length=40, null=True)
        email      = models.CharField(max_length=100, unique=True)
        contact    = models.CharField(max_length=15)
        address    = models.CharField(max_length=100, null=True)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        class Meta:
            db_table = 'users'

    users/models.py

    from django.db import models
    
    class Category(models.Model):
        name        = models.CharField(max_length=40)
    
        class Meta:
            db_table = 'categories'
    
    class SubCategory(models.Model):
        name        = models.CharField(max_length=40)
        category    = models.ForeignKey('Category',on_delete=models.CASCADE)
    
        class Meta:
            db_table = 'sub_categories'
    
    class Product(models.Model):
        name         = models.CharField(max_length=40)
        price        = models.DecimalField(max_digits=8, decimal_places=2)
        weight       = models.CharField(max_length=10)
        sub_name     = models.CharField(max_length=40)
        description  = models.TextField()
        sub_category = models.ForeignKey('SubCategory',on_delete=models.CASCADE)
        tag         = models.ManyToManyField('Tag', through='ProductTag')
        
        class Meta:
            db_table = 'products'
    
    class Tag(models.Model):
        name = models.CharField(max_length=40)
        
        class Meta:
            db_table = 'tags'
    
    class ProductTag(models.Model):
        product = models.ForeignKey('Product', on_delete=models.CASCADE)
        tag     = models.ForeignKey('Tag', on_delete=models.CASCADE)
       
        class Meta:
            db_table = 'products_tags'
    
    class Image(models.Model):
        url     = models.CharField(max_length=2000)
        product = models.ForeignKey('Product', on_delete=models.CASCADE)
    
        class Meta:
            db_table = 'images'

    carts/models.py

    from django.db import models
     
    class Cart (models.Model):
        user     = models.ForeignKey('users.User', on_delete=models.CASCADE)
        product  = models.ForeignKey('products.Product', on_delete=models.CASCADE)
        quantity = models.IntegerField(default=1)
    
        class Meta:
            db_table = 'carts'

    wishes/models.py

    from django.db import models
     
    class Wish (models.Model):
        user    = models.ForeignKey('users.User', on_delete=models.CASCADE)
        product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    
        class Meta:
            db_table = 'wishes'

    👏 エラーオカレンス👏


    carts/希望中のモデル.最初にpyを作成すると、ユーザーと製品が参照されます.from users.models import Userfrom products.models import Productを編成しました
    その後、models.ForeignKey('User', on_delete=models.CASCADE)を作成して移行し、多くのエラーが発生しました.
    原因を見つけましょう.🤔
    👉 Djangoで他のappを参照するモデルには2つの方法があります
  • クラス自体をどのように伝えるか
    : from users.models import User   models.ForeignKey(User, on_delete=models.CASCADE)
  • クラスを転送しない方法
    : models.ForeignKey('users.User', on_delete=models.CASCADE)
  • 今度はもう分かったから、これからは同じ原因でミスをしないでください.くれぐれも

    3.モデリングアドバイザコメント


    1.クラス名/テーブル名の指定

    class Image(models.Model):
        url         = models.CharField(max_length=200)
        product      = models.ForeignKey('Product', on_delete=models.CASCADE)
        class Meta:
            db_table = 'image'
    -------------------------------------------------------------------------
    class ProductImage(models.Model):
        url    = models.CharField(max_length=2000)
        product = models.ForeignKey('Product', on_delete=models.CASCADE)
        class Meta:
            db_table = 'product_images'
    画像の場合は、複数の画像テーブルが表示される場合がありますので、どの画像が格納されているテーブルを表示するのが望ましいですか.
    画像のurlには、500を軽く超えるサイズもたくさんあるので、十分なサイズを選ぶことができます.
    class User(models.Model):
        user_id	     = models.CharField(max_length=40)
    -------------------------------------------------------------------
    class User(models.Model):
        user_name = models.CharField(max_length=40, unique=True)
    会員登録時に使用するIDフィールドは通常user nameを使用します
    IDは一意の値でなければならないので、唯一の属性を掛けたほうがいいです.
    ユーザーがuser name以外に唯一の属性が必要だと思っている場合は、それを追加します.
    すべてのファイルの各ブロック=ソート
    Userクラスで唯一の属性が必要な場所はid以外にないようなので追加しません

    2.foreignkeyを指定する場合、on delete属性のすべてのCASCADEを使用する


    CASCADE以外のプロパティとその役割について


    on delete属性は全部で6種類ありますCASCADE, PROTECT, SET_NULL, SET_DEFAULT, SET(), DO_NOTHING

  • CASCADE:参照値を削除する場合は、一緒に削除
    ex.投稿は削除され、コメントも削除されます

  • PROTECT:参照値が削除された時にエラーが発生
    ex.コメントのある投稿は削除できません

  • SET NULL:参照値を削除した場合、NULL値に変更
    ex.投稿を削除するとDBにメッセージが残ります

  • SET DEFAULT:参照値を削除した場合、デフォルト値に変更
    ex.投稿を削除すると、指定したdefault投稿に自動的に投稿が割り当てられます.

  • SET():SET DEFAULTに似た概念(SQLで実行するかDjangoで実行するか...?正確な概念整理x)

  • DO NOTHING:参照値を削除しても何も行わない
    ex.コメントは存在しない投稿を参照し、参照の整合性を損なう
  • カテゴリ>サブカテゴリ>製品の参照関係は削除できないと判断したため、CASCADEからPROTECTに変更
    製品やラベル、ユーザーや希望リスト/カートについては、CASCADEが正しいと判断し、そのまま置いておきます.

    3.追加

        contact    = models.CharField(max_length=15)
        address	   = models.CharField(max_length=100, null=True)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    -----------------------------------------------------------------
        contact    = models.CharField(max_length=15)
        address	 = models.CharField(max_length=100, null=True)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    Vscodeでは間隔に応じて修正してPRを再開したが,ハブで見られるコード間隔はまた異なる.
    Vscodeでは、正しく見えても実際にアップロードされたコードは変更されていない可能性があります
    後でいつもpush後にコードが正しくアップロードされているかどうかをチェックします
    vimで再度確認して、間隔エラーを発見したので、改めて修正しました!

    4.モデリングの変更



    フロントとのミーティングでは、カテゴリ/サブカテゴリでも画像とテキストが必要であることを確認
    class Category(models.Model):
        name        = models.CharField(max_length=40)
        image       = models.CharField(max_length=2000)
        description = models.CharField(max_length=100)
    
        class Meta:
            db_table = 'categories'
    
    class SubCategory(models.Model):
        name        = models.CharField(max_length=40)
        image       = models.CharField(max_length=2000)
        description = models.CharField(max_length=100)
        category    = models.ForeignKey('Category',on_delete=models.PROTECT)
    
        class Meta:
            db_table = 'sub_categories'
    カテゴリ/サブカテゴリにも画像、ディスク立棒を追加し、再移行します.