django2.0 mysqlの次の1対1の削除と変更操作のデモ


この博文はdjango基礎操作に由来し、django下ormのmysql一対一関係モデルに対する基礎操作を実証することを目的としています.本実験を完了する前に,このブログの基礎構成を参照することができ,このブログを参照することができ,簡単で操作しやすい.djangoはゼロベースからsettingsを構成する.pyには次のものが含まれています.
  • django実行成功
  • リソースパス構成、リンクApp、コメントcsrfの操作
  • リソースパスは構成されず、mysqlデータベースへのリンクを追加できます.
    DATABASES = {
        'default': {
            'ENGINE':'django.db.backends.mysql', #     
            'NAME':'test', #          ,         
            'HOST':'127.0.0.1', #        
            'PORT':3306, #     
            'USER':'root', #    user
            'PASSWORD':'123456', #    password
        }
    }
    
    

    以下、本実験を開始する.
    じっけんステップ
  • modelsで2枚のテーブルをコードする作成
  • コマンドライン生成データベース、および移行ファイル
  • コマンドライン下でmysqlデータテーブルを操作し、添削を行います!

  • models.pyアカウントと連絡先テーブルの作成
    from django.db import models
    
    
    # Create your models here.
    class Account(models.Model):
        user_name = models.CharField(max_length=80)
        password = models.CharField(max_length= 255)
    
        def __str__(self):
            return "Account: %s"%self.user_name
    
    class Contact(models.Model):
        account = models.OneToOneField(
            Account,
            on_delete=models.CASCADE,
            primary_key=True,
        )
        mobile = models.CharField(max_length=20)
    
        def __str__(self):
            return "%s, %s"%(self.account.user_name,self.mobile)
    
    
    
  • 2つのフィールドモデルの関係は、Contactモデルのaccountフィールドによって定義される
  • OneToOneFiels()の1番目のパラメータ定義に関連付けられたモデル名
  • on_deleteパラメータは、関連モデル(Account)のレコードが削除されたときに、本モデルのレコードがどのように処理されるかを定義する.CASCADEは、この時点で本レコードも削除されることを定義するために使用される
  • 各モデルの_str__()関数モデルを定義するための表示文字列
  • データベースを生成し、移行ファイルを生成
    C:\Users\Administrator\Desktop\    \python_file\python  \    django\tes
    t02(     )>python manage.py makemigrations
    Migrations for 'app01':
      app01\migrations\0001_initial.py
        - Create model Account
        - Create model Contact
    
    C:\Users\Administrator\Desktop\    \python_file\python  \    django\tes
    t02(     )>python manage.py migrate
    Operations to perform:
      Apply all migrations: admin, app01, auth, contenttypes, sessions
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying auth.0001_initial... OK
      Applying admin.0001_initial... OK
      Applying admin.0002_logentry_remove_auto_add... OK
      Applying admin.0003_logentry_add_action_flag_choices... OK
      Applying app01.0001_initial... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0002_alter_permission_name_max_length... OK
      Applying auth.0003_alter_user_email_max_length... OK
      Applying auth.0004_alter_user_username_opts... OK
      Applying auth.0005_alter_user_last_login_null... OK
      Applying auth.0006_require_contenttypes_0002... OK
      Applying auth.0007_alter_validators_add_error_messages... OK
      Applying auth.0008_alter_user_username_max_length... OK
      Applying auth.0009_alter_user_last_name_max_length... OK
      Applying auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying sessions.0001_initial... OK
    
    
    

    対応する一対一ormテストを開始
  • AccountおよびContact作成フィールド情報
  • TypeError: Account() got an unexpected keyword argument 'mobile'
    
    In [15]: a2 = models.Account.objects.create(user_name='Rose',password='123456789')
    
    In [16]: a1
    Out[16]: <Account: Account: zhangsan1>
    
    In [17]: a2
    Out[17]: <Account: Account: Rose>
    
    In [21]: c1 = models.Contact.objects.create(account=a1,mobile='123456')
    
    In [22]: c2 = models.Contact.objects.create(account=a2,mobile='123456')
    
    
    
    
  • クエリー操作(pk=9クエリーを取得)
  • In [24]: ret = models.Account.objects.get(pk=9)
    
    In [25]: ret
    Out[25]: <Account: Account: zhangsan1>
    
  • 修正操作(pk=9のuser_nameをlistに変更)
  • In [27]: ret = models.Account.objects.filter(pk=9).update(user_name='lisi')
    
  • 削除操作を行う(a 1を削除する)
  • In [34]: a1.delete()
    Out[34]: (2, {'app01.Contact': 1, 'app01.Account': 1})
    
    In [35]: a1.save()
    
    In [36]: