Как удалить объект ссылки так, чтобы не удалить ссылающийся объект в Django?
Здесь у меня есть две модели. одна Contact и другая Sent_replies. Если клиент хочет связаться с администратором, его информация будет храниться в модели Contact. Поэтому я хочу, чтобы если администратор ответит клиенту, то эта информация будет удалена из модели Contact без удаления записи, которая находится в Sent_replies. Как я могу это сделать.
models.py
class Contact(models.Model):
message_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
email = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
comment = models.TextField(max_length=100)
date = models.DateField()
def __str__(self):
return self.name
class Sent_replies(models.Model):
message = models.ForeignKey(Contact,on_delete=models.CASCADE, null=True)
subject = models.TextField(max_length=100)
reply = models.TextField(max_length=500)
def __str__(self):
return self.message.name
Тогда набор сообщений будет установлен в NULL
message = models.ForeignKey(Contact,on_delete=models.SET_NULL, null=True)
Если я правильно понимаю, что вы хотите архивировать...
Я бы предложил сделать третью модель под названием, например, ContactRequest.
У него будет внешний ключ к Contact, который будет хранить контактную информацию.
Тогда после ответа администратора на ContactRequest вы можете связать ссылку на экземпляр Contact в Sent_replies и удалить экземпляр ContactRequest вместо него.
Сначала добавьте новое поле is_deleted, которое может быть помечено как True for replied message и False for not replied yet message
class Contact(models.Model):
message_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
email = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
comment = models.TextField(max_length=100)
date = models.DateField()
is_deleted = models.BooleanField(default=False) #new
def __str__(self):
return self.name
- теперь каждый раз, когда вы создали sent_replie, вы можете пометить его как
is_deleted = Trueэтот метод называетсяsoft deletion.
Для фильтрации сообщений, на которые еще не ответили, вы можете сделать следующее
not_replied = Contact.objects.filter(is_deleted=False)
Не забывайте делать миграции и мигрировать, и если у вас есть вопрос, пожалуйста, дайте мне знать.