sql - 如何使用 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!
有人可以指出我正确的方向吗?谢谢!
解决方案
您可以通过以下查询简单地获取与您匹配的卖方对象: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.