3

djangoormに変換できない複雑なクエリに苦労しています。

メッセージを送信しています。各メッセージは、受信者および/または受信者のグループに送信できます。特定のメッセージのすべての受信者のリストを取得する必要があり、リストに重複がないようにします(同じユーザーが異なるグループに属することができます)。

これまでの私のモデルは次のとおりです。

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

上記のクエリをメッセージモデルのメソッドにカプセル化することをお勧めします。

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 に答える