Использование наследования модели Django для клонирования таблицы

#django

#django

Вопрос:

У меня есть таблица user, и я хочу создать резервную таблицу с именем deleted_users, которая является клоном таблицы user. Когда пользователь удаляется, я хочу переместить запись из таблицы user в таблицу deleted_users .

 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"
  

Я пытался, как указано выше, но это создает таблицу user со всеми полями и таблицу deleted_users с 2 полями ( lcusers_ptr_id и deleted_at ), как я могу создать 2-ю таблицу со всеми полями, не вводя все по одному?

Комментарии:

1. Я думаю, что это плохой дизайн. Почему вы хотите иметь отдельную таблицу для почти точно такой же структуры? Почему бы просто не иметь одну таблицу с deleted_at полем, и если это поле None , чем пользователь, не удаляется, и наоборот.

2. предположим, что каждая запись является пользователем в нашей системе. если пользователь будет удален и попытается создать того же пользователя, используя его электронную почту, это не позволит, поскольку электронная почта должна быть уникальной. Есть ли лучший способ справиться с этой ситуацией?

3. @WilletteLynch: в Django уже есть поле «is_active», если оно становится ложным, пользователь считается неактивным. Что, если у вас есть внешние ключи для пользователей где-то в вашей системе, должны ли все эти данные исчезнуть, когда пользователь становится неактивным / удаляется?

4. «электронная почта должна быть уникальной», это доставит вам больше проблем, чем вы ожидаете, как вы думаете, что произойдет, если я создам учетную запись, удалю ее, создам другую с тем же электронным письмом и удалю больше, чем один?

5. См. docs.djangoproject.com/en/1.10/ref/contrib/auth/…

Ответ №1:

чтобы достичь того, что вы ищете, вам на самом деле нужны 3 модели: одна абстрактная и две фактические модели:

 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"
  

Используя абстрактную модель в качестве общего родителя, Django фактически создаст полные таблицы для каждой из моделей.

Редактировать:

Что касается уникального сообщения электронной почты, вы можете не устанавливать для него значение unique на уровне базы данных и управлять им через свои формы, потому что, если вы создаете и регистрируете электронную почту example@example.org , удалите его, создайте другой с тем же адресом электронной почты и удалите новую учетную запись, которую вы будете пытаться создать.два удаленных пользователя с одним и тем же адресом электронной почты.

другим вариантом было бы удалить поле электронной почты из абстрактной модели и поместить его в каждую из дочерних моделей, чтобы оно было уникальным только для не удаленного пользователя.

Комментарии:

1. Спасибо. Как вы думаете, мой дизайн ошибочен? есть ли лучший / более простой способ сделать это?

2. @WilletteLynch хотя это определенно не лучший способ, я не знаю, насколько продвинут в разработке этот проект, поэтому, если это возможно, вам, вероятно, следует хотя бы рассмотреть возможность использования логического удаления и посмотреть, не нарушает ли это слишком большую часть существующего проекта, чтобы его стоило рефакторинга.