Как обновить дату последнего сообщения в модели Django

У меня есть две модели, в которых пользователи создают пост и комментируют этот пост. Когда пользователи комментируют это сообщение, я хочу обновить дату last_message в модели UserPost. Если комментариев еще нет, я хочу, чтобы дата last_message по умолчанию была установлена на дату создания поста.

Модели:

class UserPosts(models.Model):
   postTitle = models.CharField(max_length=100, verbose_name="Title")
   postContent = RichTextField(null=True, verbose_name="Content")
   created_at = models.DateTimeField(
                auto_now_add=True, verbose_name="Date of upload")
   last_message = ?????????????????

   def __str__(self):
       return self.postTitle



class UserMessages(models.Model):
    postMessages = RichTextField(null=True, verbose_name="Message")
    post = models.ForeignKey(
             UserPosts, on_delete=models.CASCADE, verbose_name="Linked Post", null=True)
   created_at = models.DateTimeField(auto_now_add=True, verbose_name="Date of upload")

Я не смог найти ничего относящегося к этой теме в документации Django, Google и других источниках.

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

class UserPosts(models.Model):
    postTitle = models.CharField(max_length=100, verbose_name="Title")
    postContent = RichTextField(null=True, verbose_name="Content")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Date of upload")
    
    @property
    def last_message(self):
        last_message = self.usermessages_set.order_by('-created_at').first()
        if last_message:
            return last_message.created_at
        return self.created_at

Таким образом, если у сообщения еще нет сообщения, оно получит свое собственное поле created_at. Затем вы можете использовать его как свойство:

post = UserPosts.objects.first()
print(post.last_message)

Также рассмотрите возможность использования cached_property, если вы планируете использовать это поле в представлении несколько раз.

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