2016-10-13 9 views
0

私はユーザテーブルを持っており、ユーザテーブルの複製であるdeleted_usersというバックアップテーブルを作成したいと考えています。ユーザーが削除されると、レコードをユーザーテーブルからdeleted_usersテーブルに移動します。Djangoモデルの継承を使用してテーブルを複製する

class LCUser(models.Model): 
    email = models.EmailField(max_length=100,unique=True) 
    password = models.CharField(max_length=100) 
    first_name = models.CharField(max_length=100) 
    last_name=models.CharField(max_length=100) 
    class Meta: 
     db_table = "user" 

class LCUserDeleted(LCUser): 
    deleted_at = models.DateTimeField(auto_now_add=True,null=True) 
    class Meta: 
     db_table = "deleted_users" 

どのように私はですべて1を入力せずに、すべてのフィールドを持つ第二のテーブルを作成することができ、私は上記のように試みたが、これは2つのフィールド(lcusers_ptr_idとdeleted_at)ですべてのフィールドを持つユーザーテーブルとdeleted_usersテーブルを作成し、 1 ?

+0

これは悪いデザインだと思います。なぜあなたはほぼ同じ構造のために別のテーブルを持っていたいのですか?なぜ、一つのテーブルに 'deleted_at'フィールドがあり、このフィールドが' None'でuserが削除されていないのであれば、その逆もあります。 –

+0

は、各レコードがシステム内のユーザーであると想定しています。ユーザーが削除され、電子メールを使用して同じユーザーを作成しようとすると、電子メールは一意でなければならないため、許可されません。この状況に対処するより良い方法はありますか? –

+0

@WilletteLynch:Djangoにはすでに "is_active"フィールドがあり、Falseになるとユーザは非アクティブと見なされます。ユーザーのシステムのどこかに外部キーがある場合、ユーザーが非アクティブになったり削除されたりすると、そのデータはすべて消えてしまいますか? – RemcoGerlich

答えて

2

あなたが探しているものを達成するために、実際に3機種、1つの抽象1と2つの実際のモデルが必要です。共通の親ジャンゴとして抽象モデルを使用することにより

class BaseLCUser(models.Model): 
    email = models.EmailField(max_length=100,unique=True) 
    password = models.CharField(max_length=100) 
    first_name = models.CharField(max_length=100) 
    last_name=models.CharField(max_length=100) 
    class Meta: 
     abstract = True 

class LCUser(BaseLCUser): 
    class Meta: 
    db_table = "user" 

class LCUserDeleted(BaseLCUser): 
    deleted_at = models.DateTimeField(auto_now_add=True,null=True) 
    class Meta: 
     db_table = "deleted_users" 

は実際にはそれぞれのための完全なテーブルを作成します。モデルの

編集:ユニークなEメールについて

、あなたは、データベースレベルでユニークにそれを設定しないと、フォームを通じてそれを制御する場合がありますので、あなたが作成し、例えば、@電子メールの例を占めている場合。それを削除し、同じ電子メールで別のアカウントを作成し、新しいアカウントよりも削除すると、同じ電子メールで2人の削除されたユーザーが作成されます。

別のオプションは、抽象モデルから電子メールフィールドを削除し、削除されていないユーザーでのみ一意である各子モデルに配置することです。

+0

ありがとうございます。私のデザインに欠陥があると思いますか?これを行うにはより良い/簡単な方法がありますか? –

+0

@WilletteLynchこれは間違いなく最善の方法ではありませんが、私はこのプロジェクトの進展状況を知らないので、もし可能であれば、少なくとも論理的な削除を検討し、あまりにも多くの既存のプロジェクトはリファクタリングの価値があります。 –

関連する問題