Ofi*_*chy 3 python django django-models django-queryset
我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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个实用程序方法,为给定的用户提供他(和他一个人)相关联的消息.
即:
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')
Run Code Online (Sandbox Code Playgroud)
只会回来m2.
假设我在user正确的模型实例中,它归结为一行,我尝试了以下这些:
user.message_set.annotate(usr_cnt=Count('users')).filter(usr_cnt__lte=1)
Run Code Online (Sandbox Code Playgroud)
要么:
messages = Message.objects.filter(users__id__in=[user.id])
Run Code Online (Sandbox Code Playgroud)
和:
messages = Message.objects.filter(users__id__exact=user.id)
Run Code Online (Sandbox Code Playgroud)
和:
messages = Message.objects.filter(users__contains=user)
Run Code Online (Sandbox Code Playgroud)
等等...我总是得到两个m2 和 m1.
试过注释,排除,过滤等.
有人可以帮我弄这个吗?
qs = Message.objects.annotate(cc=Count('users')).filter(cc=1)
Run Code Online (Sandbox Code Playgroud)
上面的查询将返回只有单个用户与之关联的所有消息.
要按用户过滤,请在末尾添加另一个过滤器,以根据用户过滤带注释的查询:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |