2012-06-15 21 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

相關問題