如何使用SQL查询访问Django ManytoMany中的数据

如何使用SQL查询访问Django ManytoMany中的数据,sql,django,postgresql,many-to-many,Sql,Django,Postgresql,Many To Many,我在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

我在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)

我试图在我的Postgresql数据库上运行SQL查询,但是我找不到一种明确的方法来编写SQL查询以访问多对多关系中的信息

我有卖家ID,我想在帐户中获取用户名。如果我尝试以下显然不正确的方法,它将不起作用,但我不知道下一步该怎么做:

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

有人能给我指出正确的方向吗?谢谢大家!

您只需通过以下查询获得与您拥有的
Seller\u id
匹配的Seller对象:

>>> seller = Seller.objects.get(pk=seller_id) # Note it would raise SellerDoesNotExists if matching pk not found
然后使用上述
卖家
对象,您可以通过以下方式获得
用户名

>>> seller.account.username
但上述查询的问题是,它会执行一个额外的查询来获取用户名

因此,为了避免额外的查询,您可以使用选择_related,它将对相关帐户执行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. 

在这两种型号中是否都有一个共同的密钥/标识符?你说你有卖家ID,但我想我在卖家课上没看到?不确定它是如何构造的,但一般来说,如果您有一个公共密钥,您应该能够将这些表连接在一起。。。?您可以发布postgresql表定义吗?那会有很大帮助谢谢你的回答!我正在尝试对数据库进行原始SQL查询(使用Heroku中的数据剪辑)。我可以在Django中解决这个问题,但我不知道如何在SQL中从多到多抓取数据。你能帮忙吗?非常感谢。在上面的示例中,您可以通过
print(qs.query)
检查负责查询结果的原始查询,该示例基本上执行内部联接。
>>> 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.