【问题标题】:ForeignKey model query filterForeignKey 模型查询过滤器
【发布时间】:2018-12-30 23:24:30
【问题描述】:

使用filter(),我如何获取当前认证用户的外键属性'recipient'?

模型.py:

class Message(models.Model):
    recipient = models.ForeignKey(CustomUser, on_delete = models.CASCADE,related_name = 'recipient',null = True)
    sender = models.ManyToManyField(CustomUser,related_name = 'messages')
    date = models.DateTimeField(auto_now_add=True, blank=True)
    subject = models.CharField(max_length = 1000, blank = True)
    message = models.TextField(blank=True, null=True)
    unread = models.BooleanField(default = True) 

class CustomUser(User):
   user_bio = models.TextField(blank=True, null=True)
   birth_date = models.DateField(null=True, blank=True)
   def __str__(self):
           return self.username

Views.py:

### Inbox list class
class InboxListView(ListView):
'''
This view lets the user view all the messages created in a list
'''
model = Message# [Message,SafeTransaction] # I want to be able to draw from two models/objects #
template_name = "myInbox/inbox.html"
paginate_by = 5

def get_context_data(self, **kwargs):
    context = super(InboxListView, self).get_context_data(**kwargs)
    context['message_list'] = Message.objects.filter(recipient=CustomUser.SOMETHING_idk)#INCORRECT FILTRATION, FIX ASAP!!!!!!!!!!!!!#
    context['now'] = timezone.now()
    context['safeTransaction_list'] = SafeTransaction.objects.all()
    return context

特别是这一行是我需要困惑的:

context['message_list']=Message.objects.filter(recipient=CustomUser.SOMETHING_idk)

我可以将什么作为特定邮件收件人的过滤器参数? 我尝试了一些类似 CustomUser 或 CustomUser.pk 或 request.authenticated_as_the_thing_I_want_specifically 的方法。等等。

我好像有点迷茫了。

感谢任何帮助。

【问题讨论】:

  • 所以你使用CustomUser作为你的认证用户?
  • self.request.user的类型是什么?

标签: django django-models filtering


【解决方案1】:

您似乎创建了一个自定义身份验证用户模型?假设已正确设置,您应该能够执行以下操作:

def get_context_data(self, **kwargs):
    context = super(InboxListView, self).get_context_data(**kwargs)
    context.update({
        'message_list': Message.objects.filter(recipient=self.request.user),
        'now': timezone.now(),
        'safeTransactionList': SafeTransaction.objects.all(),
    })
    return context

一些额外的注意事项:

  • now 可用作 django 模板标签。您可以在模板代码中{% now %}
  • 通过 Django ORM 的工作方式,您可以在模板代码 {% for message in request.user.recipient.all %}{% for message in request.user.messages.all %} 中使用以下内容,而不是在 get_context_data 中调用 ORM 来迭代登录用户的 message_list .

【讨论】:

  • 使用你的 contex.update({}) 系统我的方法最终会变成这样吗:pastebin.com/embed_js/XYXqXaZz
  • @timi95 我已经更新了完整的答案get_context_data
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2018-09-01
  • 2011-10-12
  • 2013-03-05
  • 2019-08-08
相关资源
最近更新 更多