Django将单个下划线解析为相关的字段参数

时间:2013-08-25 22:01:35

标签: django

考虑我的模特:

class CampUserInvitation(models.Model):
    user = models.ForeignKey('auth.User')
    camp = models.ForeignKey('events.Camp')
    user_accepted = models.BooleanField(default=False)

以上模型是Camp和用户之间m2m关系的中间模型:

class Camp(Event):
    invited = models.ManyToManyField('auth.User',
                                 through='events.CampUserInvitation')
    def get_users_signed(self):
        return (self.invited
                .filter(user_accepted__exact=True)
                .filter(user_accepted_timestamp__lte=self.invitation_deadline)
            )

当我想要仅将user_accepted字段设置为True的那些(在上面的get_users_signed方法中)过滤所有用户的查询集时

self.invited.filter(user_accepted__exact=True)

我明白了:

Cannot resolve keyword 'user_accepted' into field. Choices are: <bunch of attributes of the User class>

为什么django认为'接受'是用户的参数?我不应该使用双下划线吗?

1 个答案:

答案 0 :(得分:1)

这根本不是发生的事情。

invited是对用户模型的引用,因此当您对邀请进行过滤时,这就是您要过滤的模型。如果您需要在CampUserInvitation上进行过滤,则需要使用该模型上ForeignKey的反向关系:

 self.campuserinvitation_set.filter(user_accepted=True)

评论后修改这可能有效:

self.invited.filter(campuserinvitation__user_accepted=True)