Django循环记录以匹配ID问题,其他选项?

时间:2013-04-07 08:12:43

标签: python django django-models

我通过网关发送短信,并获得带有短信参考ID的回复。

12345678-2

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

然后网关使用送达回执及其所属文本的ID来调用我的服务器上的URL ...

12345678

注意区别!所以这是我需要将ID与我的数据库中的ID匹配的问题。出于某种原因,此特定网关仅发送回ID的第一部分,省略短划线-

之后的所有内容

我的第一个想法是在存储之前在没有破折号的情况下剥离数据库中的ID,但这对于我来说是的选项,因为需要存储整个事物。其他网关使用此代码我无法更改此功能。

我的第二个选择是通过循环ALL记录匹配下面的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

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

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

谢谢。

1 个答案:

答案 0 :(得分: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

这将生成一个Queryset,而不只返回一个对象。

否则请为filter()切换get()并使用__iexact,如果您有重复项,则会返回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(请注意。) 但是如果没有看到你的模型,很难说清楚。

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