首页 > 解决方案 > 在 django 中,如何返回多对多连接的另一端?

问题描述

我有一个像这样的表模式。

在此处输入图像描述

你是一个用户,你想得到list你其他用户的(作为User模型)。我有一个已知的users.id价值。

此查询的 SQL 相对简单: joinusers_B = entries_B.your_userentries_B.other_user = users_B.idwhere entries_B.your_user = x

我无法弄清楚如何在 django 中执行此操作,除非我对数据进行后处理(使用prefetch_related计数作为后处理)或生成一个非常奇怪的查询(涉及左连接和子查询的事情)。有没有办法获取Users 列表并使生成的 SQL 简单明了?

这是入门模型:

class Entry_B(models.Model):

    your_user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="entries"
    )
    other_user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="other_user_entries"
    )
    order = models.IntegerField()
    expiration_date = models.DateTimeField()

User模型不包含与这些关系相关的任何字段。

标签: pythonsqldjangopostgresql

解决方案


您可以.filter(…)[Django-doc]使用:

User.objects.filter(other_user_entries__your_user=myuser)

这将返回存在给定对象的对象的Users 。Entry_Byour_usermyuser


注意:通常使用settings.AUTH_USER_MODEL[Django-doc]引用用户模型比直接使用User模型 [Django-doc]更好。有关更多信息,您可以查看文档的引用User模型部分


推荐阅读