Django类联接查询
我有两种型号Django类联接查询,django,join,Django,Join,我有两种型号 class A(models.Model): id = PGUUIDField(primary_key=True) name = CharField(max_length=32) prefix = CharField(max_length=64) controller = models.ForeignKey(Controller) location = models.ForeignKey(B, related_name="blink") class B(mod
class A(models.Model):
id = PGUUIDField(primary_key=True)
name = CharField(max_length=32)
prefix = CharField(max_length=64)
controller = models.ForeignKey(Controller)
location = models.ForeignKey(B, related_name="blink")
class B(models.Model):
id = PGUUIDField(primary_key=True)
name = CharField(max_length=128)
A的表包含许多A对象,B的表包含许多B对象
使用原始sql我可以
SELECT b.* FROM B AS b
JOIN A AS a
ON b.id = a.location_id
我得到了a有外键的所有B对象的列表
但我一辈子都不知道如何用纯Django来做这件事。
你能告诉我怎么做吗
我已经查过select_related并试过了,但我一定是做错了什么。我一直收到一个关于对象的查询集
目前正在使用以下工具:
queryset2 = []
try:
qs = A.objects.all().values('location_id')
queryset2 = B.objects.filter(id__in=qs)
print queryset2
self.fields['location'].queryset = queryset2
当你在网上阅读时,这应该是你想要的:
B.objects.prefetch_related('blink').all()
有关这方面的详细信息,请参见教程中的.queryset2=B.objects.filter(id=a\u location\u id)——returns——全局名称“a\u location\u id”未定义()
我假设您参考的是教程中的“Choice.objects.filter(question\u pub\u date\u year=current\u year)”,我不是指这个。你也没有做他们在教程中做的事情。请注意,双下划线语法用于参数的名称,而不是参数本身。这就是为什么会出现名称错误,因为您引用的是一个名为
a\uu location\u id
的变量,您从未定义过。那么,您指的是哪一部分?在教程“问题发布日期发布年份”中,问题是模型名称,发布日期是列。这与位置id有何不同?a是型号名称,位置_id是列。我不打算为您阅读教程。这与我说的完全不同——他们的是论点的名称,你的是价值<代码>B.objects.filter(名称=值)。您可以将该语法用作名称,但不能用作值。这会不断返回所有B对象的列表。不仅仅是那些A有外键的对象,每个B
对象都有关联的A
对象,可以通过B.blink
访问。谢谢,但我必须再问一件事。如何仅获取相关项的查询集?仅获取相关项?然后,您可能希望直接在A上查询。如果id
是B对象的id,则A.objects.filter(location\u id\u in=id)
将返回与查询匹配的所有内容。或者您可以考虑使用不返回模型对象但选择值的方法。谢谢!这很有效。我最终生成了一个包含所有B.location\u id的列表,并将其作为“id”传入