Как удалить объект ссылки так, чтобы не удалить ссылающийся объект в 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
  1. теперь каждый раз, когда вы создали sent_replie, вы можете пометить его как is_deleted = True этот метод называется soft deletion
  2. .

Для фильтрации сообщений, на которые еще не ответили, вы можете сделать следующее

not_replied = Contact.objects.filter(is_deleted=False)

Не забывайте делать миграции и мигрировать, и если у вас есть вопрос, пожалуйста, дайте мне знать.

Вернуться на верх