3

我正在努力处理一个无法转换为 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'))

你能想出一个聪明的方法来做到这一点吗?

谢谢。

4

1 回答 1

3

使用Q 对象,以便您可以选择作为组的一部分发送消息的联系人以及作为同一查询集中的单个收件人的联系人。

然后使用distinct(),以免重复。

如果您不熟悉双下划线表示法(例如),请参阅有关“向后”关系groups__messages的文档。

把它们放在一起,你有:

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

您可能希望将上述查询封装在 Message 模型上的方法中:

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().

于 2012-06-15T13:42:31.590 回答