首页 > 解决方案 > 如何使用 SQL 查询在 Django ManytoMany 中访问数据

问题描述

我在 Django 站点中有两个模型,如下所示,其中一个是多对多关系:

class Seller(models.Model):
  account       = models.ForeignKey(Account, related_name='sellers',null=True, on_delete=models.SET_NULL)
  bio           = models.TextField(null=True, blank=True)
  city          = models.CharField(max_length=50, null=True, blank=True)

class Account(models.Model): 
  username      = models.CharField(max_length=50, blank=True, null=True, unique=True)
  password      = models.CharField(max_length=64)
  name          = models.CharField(max_length=50, blank=True, null=True)

我正在尝试在我的 Postgresql 数据库上运行 SQL 查询,但我找不到一种清晰的方法来编写 SQL 查询来访问多对多关系中的信息。

我有卖家 ID,我想在 Account 中获取用户名。如果我尝试以下显然不正确的方法,它将无法正常工作,但我很困惑下一步该做什么:

SELECT seller_seller.bio, seller_seller.account.id
FROM seller_seller, admin_account
WHERE ...no clue! 

有人可以指出我正确的方向吗?谢谢!

标签: sqldjangopostgresqlmany-to-many

解决方案


您可以通过以下查询简单地获取与您匹配的卖方对象:seller_id

>>> seller = Seller.objects.get(pk=seller_id) # Note it would raise SellerDoesNotExists if matching pk not found

然后使用上面的seller对象你可以得到username

>>> seller.account.username

但上述查询的问题是它为获取用户名做了一个额外的查询。

因此,为了避免额外的查询,您可以使用select_related它将与相关Account执行InnerJoin

>>> from django.db.models import F
>>> seller_id = 1  # seller id that you have
>>> qs = (Seller.objects.filter(pk=seller_id).select_related('account')
                        .annotate(username=F('account__username')))
>>> print(qs.first().username)  # Note : It would raise AttributeError if no object found matching the condition. 

推荐阅读