#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. «электронная почта должна быть уникальной», это доставит вам больше проблем, чем вы ожидаете, как вы думаете, что произойдет, если я создам учетную запись, удалю ее, создам другую с тем же электронным письмом и удалю больше, чем один?
Ответ №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 хотя это определенно не лучший способ, я не знаю, насколько продвинут в разработке этот проект, поэтому, если это возможно, вам, вероятно, следует хотя бы рассмотреть возможность использования логического удаления и посмотреть, не нарушает ли это слишком большую часть существующего проекта, чтобы его стоило рефакторинга.