Django rest - как сериализовать набор, связанный с предварительной выборкой? - PullRequest
0 голосов
/ 01 апреля 2019

я пытаюсь загрузить связанный набор в сериализатор, поэтому записи будут отображаться как вложенный словарь под родительским.

У меня в настоящее время нет ошибок, но мой API также не возвращает никаких данных для circuitits_subnets.

есть идеи? Спасибо

EDIT

Я добавил вложенный сериализатор, однако API по-прежнему не показывает ошибок и данных

views.py:

class DeviceConnViewSet(viewsets.ReadOnlyModelViewSet):
    # sub queries    
    poll_ip = Subquery(
        DeviceCircuitSubnets.objects.filter(device_id=OuterRef(
            'id'),subnet__subnet_type__poll=True).values('subnet__subnet')[:1])
    mgmt_ip = Subquery(
        DeviceCircuitSubnets.objects.filter(device_id=OuterRef(
            'id'),subnet__subnet_type__mgmt=True).values('subnet__subnet')[:1])   
    queryset = Device.objects.all().annotate(
                                    poll_ip=poll_ip,
                                    mgmt_ip=mgmt_ip
                                ) \
                                .select_related('site','site__site_type','model','model__device_type') \
                                .prefetch_related('devicecircuitsubnets_set') \
                                .order_by('site__location')  

    serializer_class = DeviceConn

serializers.py

class CircuitSubnetsSerializer(serializers.ModelSerializer):
    circuit_name = serializers.ReadOnlyField(
        source='circuit.name',
    )
    subnet = serializers.ReadOnlyField(
        source='subnet.subnet',
    )
    subnet_mask = serializers.ReadOnlyField(
        source='subnet.mask',
    )
    subnet_type = serializers.ReadOnlyField(
        source='subnet.subnet_type.subnet_type',
    )
    class Meta:
        model = DeviceCircuitSubnets
        fields = ('circuit_name', 'subnet','subnet_mask','subnet_type')

class DeviceConn(QueryFieldsMixin, serializers.HyperlinkedModelSerializer):
    poll_ip = serializers.ReadOnlyField()
    mgmt_ip = serializers.ReadOnlyField()
    bgp_as = serializers.ReadOnlyField(
        source='site.bgp_as',
    )
    location = serializers.ReadOnlyField(
        source='site.location',
    )
    site_type = serializers.ReadOnlyField(
        source='site.site_type.site_type',
    )
    device_type = serializers.ReadOnlyField(
        source='model.device_type.device_type_plural',
    )
    circuit_subnets = CircuitSubnetsSerializer(many=True, read_only=True)

    class Meta:
        model = Device   
        fields = ('site_id','poll_ip','mgmt_ip','bgp_as','hostname', 'device_type','location','site_type','circuit_subnets')  

Пример вывода API

{
    "site_id": 50,
    "poll_ip": null,
    "mgmt_ip": "10.10.10.1",
    "bgp_as": "65001",
    "hostname": "STR-LDN-SW-02",
    "device_type": "Switches",
    "location": "Lonon",
    "site_type": "Showroom"
},

1 Ответ

1 голос
/ 01 апреля 2019

На вашем сериализаторе DeviceConn добавьте поле для представления отношения, которое вы хотите сериализовать:

class DeviceConn(serializers.HyperlinkedRelatedField):
    your_related_field = serializers.HyperlinkedRelatedField(many=True, 
    read_only=True, view_name=my_view)
    class Meta:
       fields = `__all__` # or add only the fields you want.

Подробнее здесь

...