【问题标题】:Django Filter ForeignKey relationships in get_querysetDjango过滤get_queryset中的ForeignKey关系
【发布时间】:2015-05-08 08:45:33
【问题描述】:

我想知道在这里做什么。 所以我有一个 EmailAddress 类,它与我的 User 类有 ForeignKey 关系

class EmailAddress(models.Model):

user = models.ForeignKey(allauth_app_settings.USER_MODEL, verbose_name=_('user'))
email = models.EmailField(unique=app_settings.UNIQUE_EMAIL,
                          verbose_name=_('e-mail address')) 

我还有一个 UserProfile 类,它与提到的 User 具有 OneToOneField 关系,如下所示:

class UserProfile(models.Model):

user = models.OneToOneField(User, related_name='profile')
attribute= models.CharField("attr", max_length=150, blank=False)

现在在 admin.py 中,我想过滤用户,以便登录到 admintool 的当前用户只能看到来自共享某些属性的用户的电子邮件。问题是该属性保存在 UserProfile 中,我需要通过电子邮件到达那里。

基本上我不知道如何访问 UserProfile 中的“属性”。我了解我想通过查找该电子邮件所属的用户的电子邮件来过滤用户,然后将他的“属性”与发送请求的用户进行比较,以决定是否向他显示。

def get_queryset(self, request):
user = [User whos email is in the list]
qs = [the queryset]
[and then]
return qs.filter([filter so the user attribute = the request.user attribute])

顺便说一句,我正在使用 allauth。如果你想知道什么

 allauth_app_settings.USER_Model 

代表。

祝你有美好的一天!

【问题讨论】:

    标签: django


    【解决方案1】:

    您需要使用双下划线语法来遵循关系。

    qs.filter(user__userprofile__attribute=request.user.attribute)
    

    【讨论】:

    • 我如何获取用户实例?我尝试了user = User.objects.filter(email=request.email)[0]UserProfile.objects.filter(user__id=request.id):,但它不起作用。
    • 您已经在request.user 中拥有它。你不需要得到任何东西。我上面展示的代码可以是get_queryset()方法的全部内容。
    • 这就是我的问题,因为如果我尝试这样做 def get_queryset(self, request): qs = super(EmailConfirmationAdmin, self).get_queryset(request) qs.filter(user__userprofile__attribute=request.user.profile.attribute) return qs 我收到此错误消息:Cannot resolve keyword 'user' into field. Choices are: created, email_address, email_address_id, id, key, sent
    • 这不是获取当前用户的问题,而是查询模型的问题。 那是 因为您没有在问题中提供所有相关信息:这些字段来自完全不同的模型(可能是 EmailConfirmation?),显然与此管理类相关联。由于该模型显然有一个名为 email_address 的字段,它是 EmailAddress 的 ForeignKey,因此您应该将 email_address__ 添加到我上面给出的过滤器值的开头。
    • 确实,我有点困惑,忘了提及,最后它确实与(email_address__user__profile__attribute=request.user.profile.attribute) 一起工作,我了解了查找的工作原理。感谢您的耐心等待。
    猜你喜欢
    • 2021-05-26
    • 2021-12-20
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2022-11-12
    • 2022-01-03
    相关资源
    最近更新 更多