三张表之间在django中加入请求并显示所有属性
Join request in django between three tables and display all attributes
我有三个模型
class A(models.Model):
field1 = models.IntegerField()
class B(models.Model):
id_a = models.ForeignKey(A,on_delete=models.CASCADE)
field1 = models.IntegerField()
field2 = models.IntegerField()
class C(models.Model):
id_a = models.ForeignKey(A,on_delete=models.CASCADE)
field1 = models.IntegerField()
field2 = models.IntegerField()
我想写一个看起来像这样的请求:SELECT * FROM B,C,A WHERE B.id_a=C.id_a WHERE A.id_a=2 并显示两个表的所有属性
这是我尝试做的:
a_id_att = 1
data = B.objects.filter(id_a=C.objects.filter(id_a=a_id_att)[0])
没用。如何写join和make来显示表的所有属性?
您写的 SQL 语句似乎很奇怪。
SELECT * FROM B, C, A
WHERE B.id_a = C.id_a
AND A.id_a = 2
您似乎想要 A
中的一行,然后是 B
和 C
中的所有相关行,您的 SQL 查询无法实现。
你的意思是这样的吗:
SELECT * FROM B, C, A
WHERE A.id = 2
AND B.id_a = A.id
AND C.id_a = A.id
您可以使用 prefetch_related()
在 Django 中实现类似的功能,它会构建一个查询,以便在第一个查询中而不是在后续查询中将相关行加载到内存中。
# this will return a queryset with a single element, or empty
qs = A.objects.prefetch_related('b_set', 'c_set').filter(id=2)
for elem in qs: # here the single DB query is made
print(elem.field1) # A.field1
for det in elem.b_set.all():
print(det.field1) # B.field1, does NOT make another DB query
print(det.field2) # B.field2, does NOT make another DB query
for det in elem.c_set.all():
print(det.field1) # C.field1, does NOT make another DB query
print(det.field2) # C.field2, does NOT make another DB query
注意:我在这里使用 b_set
因为这是 ForeignKey
字段的默认值;如果该字段将指定不同的 related_name
.
,则此更改
这是否解决了您的问题?
我有三个模型
class A(models.Model):
field1 = models.IntegerField()
class B(models.Model):
id_a = models.ForeignKey(A,on_delete=models.CASCADE)
field1 = models.IntegerField()
field2 = models.IntegerField()
class C(models.Model):
id_a = models.ForeignKey(A,on_delete=models.CASCADE)
field1 = models.IntegerField()
field2 = models.IntegerField()
我想写一个看起来像这样的请求:SELECT * FROM B,C,A WHERE B.id_a=C.id_a WHERE A.id_a=2 并显示两个表的所有属性
这是我尝试做的:
a_id_att = 1
data = B.objects.filter(id_a=C.objects.filter(id_a=a_id_att)[0])
没用。如何写join和make来显示表的所有属性?
您写的 SQL 语句似乎很奇怪。
SELECT * FROM B, C, A
WHERE B.id_a = C.id_a
AND A.id_a = 2
您似乎想要 A
中的一行,然后是 B
和 C
中的所有相关行,您的 SQL 查询无法实现。
你的意思是这样的吗:
SELECT * FROM B, C, A
WHERE A.id = 2
AND B.id_a = A.id
AND C.id_a = A.id
您可以使用 prefetch_related()
在 Django 中实现类似的功能,它会构建一个查询,以便在第一个查询中而不是在后续查询中将相关行加载到内存中。
# this will return a queryset with a single element, or empty
qs = A.objects.prefetch_related('b_set', 'c_set').filter(id=2)
for elem in qs: # here the single DB query is made
print(elem.field1) # A.field1
for det in elem.b_set.all():
print(det.field1) # B.field1, does NOT make another DB query
print(det.field2) # B.field2, does NOT make another DB query
for det in elem.c_set.all():
print(det.field1) # C.field1, does NOT make another DB query
print(det.field2) # C.field2, does NOT make another DB query
注意:我在这里使用 b_set
因为这是 ForeignKey
字段的默认值;如果该字段将指定不同的 related_name
.
这是否解决了您的问题?