0

我通过网关发送 SMS 消息并获得带有 SMS 参考 ID 的回复。

12345678-2

我将其存储在我的数据库中。

网关然后调用我的服务器上的一个 URL 与一个交货收据和它所属的文本的 ID...

12345678

注意区别!所以这是我需要将 ID 与数据库中的 ID 匹配的问题。出于某种原因,此特定网关仅发回 ID 的第一部分,省略了破折号后的所有内容-

我的第一个想法是在存储之前删除数据库中的 ID 而没有破折号,但这对我来说不是一个选项,因为需要存储整个内容。其他网关使用此代码我无法更改此功能。

我的第二个选择是通过循环所有记录来匹配下面的 ID。

class MessageManager(models.Manager):
    def get_matching_message(self, ref_ID):
        for gateway in Gateway.objects.all():
            try:
                return Message.objects.get(
                    gateway_message_id=ref_ID
                )
            except Message.DoesNotExist:
                pass

但我不能让自己这样做,它闻起来很糟糕

我对其他想法持开放态度?

谢谢你。

4

1 回答 1

1

如果网关在您的数据库中存储重复项,则此代码可以帮助您:

class MessageManager(models.Manager):
    def get_matching_messages(self, ref_id):
        try:
            return Message.objects.filter(gateway_message_id__icontains=ref_id)
        except Message.DoesNotExist:
            pass

这将产生一个查询集,而不是只返回 1 个对象。

否则切换filter()get()使用__iexactwhich 将返回 1 个对象并MultipleObjectsReturned在有重复项时抛出异常。

class MessageManager(models.Manager):
    def get_matching_messages(self, ref_id):
        try:
            return Message.objects.get(gateway_message_id__iexact=ref_id)
        except (Message.DoesNotExist, Message.MultipleObjectsReturned):
            pass

由于您没有使用gateway迭代中的任何内容,因此现在可以跳过它,除非gateway_message_id=ref_ID应该这样做gateway.message_id=ref_ID(注意 .)但是如果没有看到您的模型就很难判断。

我不相信这种气味,但我知道你来自哪里,你面临一个你无法“修复”的问题,因为其他网关依赖于相同的代码,这使得它,嗯,至少可以说是一个麻烦.

于 2013-04-07T08:45:49.773 回答