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”传入