0

ゲートウェイ経由で SMS メッセージを送信し、SMS の参照 ID を含む返信を受け取ります。

12345678-2

これをデータベースに保存します。

次に、ゲートウェイは、配信レシートとそれが属するテキストの ID を使用して、サーバー上の URL を呼び出します...

12345678

違いに注目!したがって、IDをDBのIDと一致させる必要がある問題は次のとおりです。何らかの理由で、この特定のゲートウェイは ID の最初の部分のみを送り返し、ダッシュの後の部分はすべて省略します-

最初のアイデアは、保存する前にダッシュなしでデータベースの ID を削除することでしたが、すべてを保存する必要があるため、これはオプションではありません。他のゲートウェイがこのコードを使用しています。この機能を変更することはできません。

私の 2 番目のオプションは、すべてのレコードをループして、以下のように 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 つだけ返されるわけではありません。

それ以外の場合は、1 つのオブジェクトを返し、重複がある場合は例外をスローするように切り替えfilter()get()使用します。__iexactMultipleObjectsReturned

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_IDgateway.message_id=ref_ID

これが臭いとは思いませんが、あなたがどこから来ているのかわかりました。他のゲートウェイが同じコードに依存しているため、「修正」できない問題に直面していて、うーん、控えめに言っても迷惑です.

于 2013-04-07T08:45:49.773 に答える