查询跨越并回溯多个表
Query which spans and follows back several tables
我的问题是关于创建一个查询来过滤通过多个中间表相关的对象。我的关系数据库如下所示:
一个用户可以上传任意数量的产品(一对多关系)。但是,用户也可以对产品进行排名。一个排名可以由多个用户完成,一个用户可以有多个排名(多对多关系)。 Product 和 Ranking 之间也是如此。我使用通过参数定义 M2M 关系的显式中间表(Rank 和 Belong),因为它们具有描述关系的附加信息。
模型代码是这样的(为简单起见,我省略了不相关的字段):
class Product(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
belong= models.ManyToManyField(Ranking, through="Belong")
#...
#The M2M table which relates Product and Ranking
class Belong(models.Model):
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("ranking", "product"))
class Ranking(models.Model):
user= models.ManyToManyField(settings.AUTH_USER_MODEL, through="Rank")
created = models.DateTimeField(auto_now_add=True)
#...
#The M2M table which relates User and Ranking
class Rank(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("user", "ranking"))
#The AUTH_USER_MODEL, which is not included here
我的问题是:如何创建一个查询来过滤已由给定用户排名的产品?这意味着 Belong、Ranking 和 Rank 表之间的“回溯”关系。我在 Django tutorial 之后尝试了这个,但它没有用:
Product.objects.filter(belong__ranking__rank__user=”username”)
您对 M2M 关系及其直通模型有点困惑。
比如,我不明白为什么你的M2M从Product到Ranking叫"belong"。应该叫"rankings"。你的 M2M 从 Ranking 到 User 至少有正确的基本名称,但它指向许多用户所以应该是 "users".
然而,关键是当你关注 M2Ms 时,你不需要考虑直通表。另一个问题是 "user" 本身就是一个模型,因此要与用户名进行比较,您需要继续关注该字段。所以:
Product.objects.filter(belong__user__username="username")
我的问题是关于创建一个查询来过滤通过多个中间表相关的对象。我的关系数据库如下所示:
一个用户可以上传任意数量的产品(一对多关系)。但是,用户也可以对产品进行排名。一个排名可以由多个用户完成,一个用户可以有多个排名(多对多关系)。 Product 和 Ranking 之间也是如此。我使用通过参数定义 M2M 关系的显式中间表(Rank 和 Belong),因为它们具有描述关系的附加信息。
模型代码是这样的(为简单起见,我省略了不相关的字段):
class Product(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
belong= models.ManyToManyField(Ranking, through="Belong")
#...
#The M2M table which relates Product and Ranking
class Belong(models.Model):
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("ranking", "product"))
class Ranking(models.Model):
user= models.ManyToManyField(settings.AUTH_USER_MODEL, through="Rank")
created = models.DateTimeField(auto_now_add=True)
#...
#The M2M table which relates User and Ranking
class Rank(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("user", "ranking"))
#The AUTH_USER_MODEL, which is not included here
我的问题是:如何创建一个查询来过滤已由给定用户排名的产品?这意味着 Belong、Ranking 和 Rank 表之间的“回溯”关系。我在 Django tutorial 之后尝试了这个,但它没有用:
Product.objects.filter(belong__ranking__rank__user=”username”)
您对 M2M 关系及其直通模型有点困惑。
比如,我不明白为什么你的M2M从Product到Ranking叫"belong"。应该叫"rankings"。你的 M2M 从 Ranking 到 User 至少有正确的基本名称,但它指向许多用户所以应该是 "users".
然而,关键是当你关注 M2Ms 时,你不需要考虑直通表。另一个问题是 "user" 本身就是一个模型,因此要与用户名进行比较,您需要继续关注该字段。所以:
Product.objects.filter(belong__user__username="username")