【问题标题】:django 2 - Nested query based off multiple modelsdjango 2 - 基于多个模型的嵌套查询
【发布时间】:2018-12-10 13:53:31
【问题描述】:

更新:见底部。

我正在努力思考如何根据我的需要实现嵌套/链式查询。可能有更好的方法来获得我需要的结果,所以请告诉我。

尝试获取经过身份验证的用户并获取我正在工作的朋友列表,并且我得到了朋友的查询集对象。我想将朋友的查询集对象传递给另一个搜索 Post 模型的查询,将找到的用户名 Friend.users 与 Post.creator 相匹配,所以我得到另一个查询集,它将包含我所有朋友的所有帖子,我可以显示在模板中。

class Friend(models.Model):
    users = models.ManyToManyField(User, blank=True)
    owner = models.ForeignKey(User, related_name='owner_friend', on_delete=models.CASCADE, null=True, blank=True)

class Post(models.Model):
    creator = models.ForeignKey(User, on_delete=None, null=True)

编辑:

我正在尝试用我的代码做到这一点

f = Friend.objects.all().filter(owner__username='admin').filter(users__username='jeff')

输出

<QuerySet [<Friend: Friend object (1)>]>


p = Post.objects.all().filter(creator__username__in=f)

ValueError: Cannot use QuerySet for "Friend": Use a QuerySet for "User".

感谢您的帮助。

更新 1:

我已将模型更改为使用 ForeignKeys。我一直在使用 shell 进行测试,得到了一个意想不到的结果,见下文。

class Friend(models.Model):
    users = models.ForeignKey(User, related_name='user_friend', on_delete=models.CASCADE, null=True, blank=True)
    owner = models.ForeignKey(User, related_name='owner_friend', on_delete=models.CASCADE, null=True, blank=True)

f = Friend.objects.filter(owner__username='admin').values_list('users__username', flat=True)

输出

<QuerySet ['jeff', 'sam']>



Post.objects.filter(creator__username__in=list(f))

输出

<QuerySet []>

如果我手动输入列表

Post.objects.filter(creator__username__in=['admin', 'jeff'])

输出

<QuerySet [<Post: Post Title 1>]>

我认为如果我可以让 __in=list(f) 工作,这应该可以解决问题。

更新 2

list(f) 实际上正在工作,我没有为被拉入的朋友的用户帐户链接的帖子。为朋友创建帖子后,我现在得到了一个查询集。

我不确定我在做什么是最好的方法,但它确实有效。

希望对未来的读者有所帮助。

【问题讨论】:

  • 为什么不直接给User加一个friends字段?

标签: python django python-3.6


【解决方案1】:

朋友模式有点奇怪,给你带来了一些困难。实际上,Friend 应该是 User 与自身之间的多对多关系中的直通表。大概您使用的是内置的 User 模型,这就是您使用外部模型的原因;但您仍然可以使用两个外键模拟一个直通表:

class Friend(models.Model):
    from_user = models.ForeignKey(User, related_name='users_from', on_delete=models.CASCADE)
    to_user = models.ForeignKey(User, related_name='users_to', on_delete=models.CASCADE)

现在您的查询可以是:

Post.objects.filter(creator__users_to__from_user__username='admin')

也就是说,给我所有帖子,其创建者位于朋友关系的“to_user”端,其中 from_user 的用户名是“admin”。

【讨论】:

  • 我已经更新了我的模型以使用 ForeignKey,因此不再需要 M2M。我遇到了前进的道路,我会更新我的帖子以反映这一点,但我遇到了另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2019-01-05
  • 2017-07-30
  • 2023-03-16
  • 2019-10-07
  • 2013-12-31
  • 1970-01-01
相关资源
最近更新 更多