我有两个Django表:A
和B
。它们之间存在许多关系,写在表A
中。
我遇到的问题是,当我将其用作API并将对象表示为A.objects.all().values()
时,B
的值不会显示。
我想用many2many关系的A
注释Django表ids
,以便在执行A.objects.all().values()
时可以拉出它们以获得A.B_ids=['134','141','1414']
。 / p>
例如,这可以做到,但是我随时随地都可以在Django中进行迭代,它可以更快地完成:
@api_view(['GET'])
def pull_tasks():
a_values = list(A.objects.all().values())
for a in a_values:
a['b_values'] = (A.objects.get(id=a['id']).b.all().values())
return Response(a_values, status=status.HTTP_200_OK)
答案 0 :(得分:0)
您可以通过使用.values_list('id', flat=True)
并在多对多关系查询中使用B
模型来构建快速修复程序。例如:
@api_view(['GET'])
def pull_tasks():
a_values = list(A.objects.all().values())
for a in a_values:
a['b_values'] = list(B.objects.filter(a_id=a['id']).values_list('id', flat=True))
return Response(a_values, status=status.HTTP_200_OK)
因此,现在我们为相关的B
元素构造一个简单的ID列表,但这并不是很有效,因为我们对每个 A
对象执行一次提取,这很容易变得非常昂贵。
您在这里所做的基本上是编写 serializer 。但是Django已经通过编写序列化程序来支持该功能:使用Django REST框架。例如:
from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField
class ASerializer(ModelSerializer):
skills_ids = PrimaryKeyRelatedField(
many=True,
read_only=False,
queryset=B.objects.all(),
source='b'
)
class Meta:
model = A
然后您可以用作视图:
@api_view(['GET'])
def pull_tasks():
ser = ASerializer(A.objects.prefetch_related('B'), many=True)
return Response(ser.data, status=status.HTTP_200_OK)
通过使用prefetch_related(..)
,我们将在另一个查询中获取所有相关的B
,而不是每个A
对象查询一次。