django使用object_id字段通过对象注解qs

yv5phkfx  于 2023-01-27  发布在  Go
关注(0)|答案(1)|浏览(110)

得到了用户和角色。我怎样才能得到用户注解的角色?

from django.db import models, F, Q

class User(models.Model):
    pass

class Role(models.Model):
    ...
    user_id = models.PositiveIntegerField(
        verbose_name='Related object ID'
    )

我想做这样的事情:

roles = Role.objects.all()
roles = roles.annotate(user=Q(User.objects.get(id=F('user_id'))))

for role in roles:
    print(role.user.id) => 123

追溯:

FieldError: Cannot resolve keyword 'user_id' into field

PS:我不需要外键或ManytoMany,我需要的正是这个关系。

ruarlubt

ruarlubt1#

您在问题中提到的解决方案在这里不起作用,因为F(...)查询指向User模型本身,而不是Role模型,因此无法解析字段。
另外,我推荐@Iain在评论部分提到的内容,因为这样你就可以直接从Role对象访问user对象,你可以考虑OneToOne关系。
另一方面,如果您不想在模型中有关系,那么您最多可以从User模型访问一个字段,如下所示(使用子查询):

from django.db.models import OuterRef, Subquery

roles = roles.annotate(username=Subquery(User.objects.filter(id=OuterRef('user_id')).values('username')[:1]))

相关问题