私はこれを理解するのに少し苦労しています。私は 2 つのカスタム ユーザー モデル (たとえば、Buyer、Seller) を持っています。これは、すべての共通フィールド (email
フィルターに必要なものを使用するものを含む) を保持し、モデルである単一のカスタム ユーザー モデル (CustomUser) を拡張しabstract
ます。
現在、サードパーティの電子メール サービスを使用して、アプリケーションとの間で電子メール メッセージを送受信しています。サードパーティ サービスは、イベントについて通知します。たとえば、メールがバウンスまたは失敗した場合、彼らはcallback
URL で POST リクエストを送信し、リクエストを認証した後、記録を更新し、どのメールが失敗したかを記録します。
送信されたメッセージを保存する追加の電子メール モデル (SentMessage) があります。このモデルはこんな感じ。
class SentMessage(models.Model):
subject = models.CharField(max_length=100)
body = models.TextField()
sender = models.ForeignKey(models.InternalUser)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
recipient = generic.GenericForeignKey('content_type', 'object_id')
bounced = models.BooleanField(default=False)
ご覧recipient
のとおり、上記のモデルのフィールドは であり、GenericForeignKey
他のモデル (この場合は買い手または売り手) にバインドできます。これは、バウンス イベントなどでメッセージがバウンスされた場合にレコードを更新するモデルです。サード パーティ サービスから提供された電子メール アドレスを使用して受信者を除外しようとしています。ということで、基本的にはこんな流れになります。
SentMessage
--> 特定の電子メール アドレスを使用して受信者を除外します (受信者は購入者または販売者のいずれかになります) --> 上記を使用して、イベントの種類に応じてバウンスまたは失敗したものをフィルター処理します。
ここで最初のポイントで立ち往生しています。Buyer
モデルまたはモデルに存在するオブジェクトをフィルターするにはどうすればよいですかSeller
。CustomUser
クラスは抽象クラスであり、両方Buyer
からSeller
継承されるため、次のこともできません。
recipient = models.CustomUser.objects.get(email=bounced_email)
特定の電子メール アドレスから 、content_type
をobject_id
検索(フィルタ) する最良の方法は何ですか?recipient