2012-06-15 23 views
3

我正在拼命处理一个复杂的查询,我无法翻译成django orm。如何使用django orm获取所有收件人的邮件?

我正在发送消息。每封邮件都可以发送给收件人和/或收件人组。我需要获取给定邮件的所有收件人列表,并且我不希望列表中有任何重复邮件(同一用户可能位于不同组中)。

这里是我的模型至今:

class Contact(models.Model): 
    email = models.EmailField(_('Email'), null=True, blank=True) 
    groups = models.ManyToManyField('Group', related_name='members', null=True, 
            blank=True, verbose_name=_('Groups')) 

class Group(models.Model): 
    name = models.CharField(_('Name'), max_length=50) 


class Message(models.Model): 
    body = models.TextField(_('Body')) 
    recipients = models.ManyToManyField('contacts.Contact', 
             null=True, blank=True, 
             related_name='messages', 
             verbose_name=_('Recipients')) 
    groups = models.ManyToManyField('contacts.Group', 
            null=True, blank=True, 
            related_name='messages', 
            verbose_name=_('Groups')) 

你能想到的一个聪明的方式做到这一点?

谢谢。

回答

3

使用Q objects,以便您可以选择两个联系人messaged作为一个组的一部分,并将联系人作为同一个queryset中的单个收件人。

然后使用distinct(),这样你就不会重复。

如果您不熟悉双下划线表示法(例如),请参阅following relationships "backward"上的文档。

全部放在一起,你必须:

message = message.objects.get(id=message_id) 
Contact.objects.filter(Q(groups__messages=message)|Q(messages=message)).distinct() 

您可能需要封装在方法上的消息模型上面的查询:

class Message(models.Model): 
    # field definitions 

    def get_recipients(self): 
     return Contact.objects.filter(Q(groups__messages=message)|Q(messages=message)).distinct() 

那么在你看来,你可以简单地写message.get_recipients()

+0

就是这么简单。谢谢(我只是把'group__messages'改成'groups__messages')。 –

+0

为我的回答添加了缺少的_s_ :) – Alasdair

相关问题