我有點難以理解這一點。我有兩個自定義用戶模型(例如:Buyer,Seller),它擴展了一個包含所有常用字段(包括我們需要用來過濾東西的email
)的單個自定義用戶模型(CustomUser),並且是abstract
模型。在Django中使用GenericForeignKey進行復雜的過濾
現在,我們正在使用第三方電子郵件服務來收發來自我們應用程序的電子郵件。第三方服務通知我們一個事件。比如說,如果電子郵件被退回或失敗,他們會向我們發送一個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
給的電子郵件地址
這是你需要去的地方https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/首先你得到content_type的類,然後使用object_id得到對象 – n3storm 2013-03-25 08:13:32