Django unique\u一起抛出服务器错误,不知道为什么

2024-10-01 09:20:56 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,这里有一些背景,我们已经使用django和mysql为我们的应用程序构建了一个消息传递系统。我们内置了read\u回执来告诉用户何时需要读取线程。每当调用API端点get\u消息时,我们都会创建一个read\u回执,它会返回任何新消息。在应用程序中,如果用户打开了一个线程,则每隔5秒调用一次get\ messages。读回执对于线程和用户来说是唯一的(即每个线程和用户只能有一个读回执,但是一个线程或用户可以“拥有”多个读回执)。我们经常遇到一个服务器错误,试图创建一个与另一个read\u回执具有相同线程和用户的read\u回执。我们创建read\u收据的唯一地方是我在下面发布的create\u individual\u message\u read\u receipt()中。我被难住了,因为代码应该确保用户的read\u回执已经被删除,并且在创建另一个回执之前线程(如果它存在的话)。有什么想法吗?我认为这可能与通话频率有关,但我们希望交易能够解决这个问题。你知道吗

class IndividualMessageThreadReadReceipt(models.Model):
"""
Stores whether user has read the most recent message
"""

    thread = models.ForeignKey(
    IndividualMessageThread, related_name='read_receipts')

    user = models.ForeignKey('accounts.User')

    last_read_message = models.ForeignKey('messages.IndividualMessage')

    last_updated = models.DateTimeField(auto_now_add=True)

    class Meta(object):
        ordering = ('id',)
        unique_together = ('user', 'thread')



@transaction.commit_manually()
def create_individual_message_thread_read_receipt(individual_thread,
                                              message, user):
"""
create message read receipt between individuals, deletes the old
receipt so the receipt should be unique for the user and thread
"""
    try:
        ind_read_receipt = (IndividualMessageThreadReadReceipt.objects
                            .select_for_update().get(
                                thread=individual_thread.id,
                                user=user.id))
        if ind_read_receipt.last_read_message_id < message.id:
            ind_read_receipt.delete()
            IndividualMessageThreadReadReceipt.objects.create(
                thread=individual_thread, last_read_message=message,
                user=user)
    except IndividualMessageThreadReadReceipt.DoesNotExist:
        IndividualMessageThreadReadReceipt.objects.create(
            thread=individual_thread, last_read_message=message, user=user)
    transaction.commit()

Tags: the用户idmessagereadgetmodelscreate