3

djangoメッセージのデータベースを維持するために使用しています。
とりわけ、私は次のモデルを持っています:

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=10)

class Message(models.Model):
    id = models.IntegerField(primary_key=True)
    body = models.CharField(max_length=200)
    users = models.ManyToManyField(User)

特定のユーザーに対して、彼 (および彼だけ) に関連付けられているメッセージを提供するユーティリティ メソッドを作成しようとしています。

すなわち:

m1 = Message(id=1, body='Some body')
m1.save()
m2 = Message(id=2, body='Another body')
m2.save()
m3 = Message(id=3, body='And yet another body')
m3.save()

u1 = User(name='Jesse James')
u1.save()
u2 = User(name='John Doe')
u2.save()

m1.users.add(u1, u2)
m2.users.add(u1)
m3.users.add(u2)

getMessagesFor('Jesse James')

のみを返しm2ます。
私が正しいモデルインスタンスを持っていると仮定するとuser、それは1行に要約され、次のことを試しました:

    user.message_set.annotate(usr_cnt=Count('users')).filter(usr_cnt__lte=1)

または:

    messages = Message.objects.filter(users__id__in=[user.id])

と:

    messages = Message.objects.filter(users__id__exact=user.id)

と:

    messages = Message.objects.filter(users__contains=user)

など...常にm2 AND m1の両方を取得します。
注釈、除外、フィルターなどを試しました。

誰かがこれで私を助けることができますか?

4

2 に答える 2

6
qs = Message.objects.annotate(cc=Count('users')).filter(cc=1)

上記のクエリは、単一のユーザーのみが関連付けられているすべてのメッセージを返します。

ユーザーでフィルター処理するには、最後に別のフィルターを追加して、ユーザーに従って注釈付きクエリをフィルター処理します。

qs = Message.objects.annotate(cc=Count('users')).filter(cc=1).filter(users__id=user.id)
# if user user.id=1, this will return only m2
于 2012-12-28T10:41:29.190 に答える
0

もしかしてこういうこと?(未検証)

for msg in Messages.objects.all():
    if (user in msg.users_set.all() and len(msg.users_set.all()) == 1):
        # do something
于 2012-12-28T10:31:37.183 に答える