Django Many2Many注解

时间:2018-07-30 07:11:03

标签: python django

我有两个Django表:AB。它们之间存在许多关系,写在表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)

1 个答案:

答案 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对象查询一次。