我有点难以理解这一点。我有两个自定义用户模型(例如: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