gpt4 book ai didi

python - Django ManyToMany 按集合大小或集合中的成员过滤

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:41 25 4
gpt4 key购买 nike

我正在使用 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 中有正确的模型实例,它归结为一行,我已经尝试了以下这些:

    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
尝试过注释、排除、过滤器等。

有人可以帮我解决这个问题吗?

最佳答案

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

关于python - Django ManyToMany 按集合大小或集合中的成员过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com