я пытаюсь загрузить связанный набор в сериализатор, чтобы все выглядело как вложенный словарь под родителем.
В настоящее время у меня нет ошибок, но мой API также вообще не возвращает никаких данных для Circuits_subnets.
есть идеи? Спасибо
РЕДАКТИРОВАТЬ
Я добавил вложенный сериализатор, однако API по-прежнему не показывает ошибок и данных.
просмотров.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
сериализаторы.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"
},





В сериализаторе 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.
да. Это путь. Однако, если вам нужны подробности, вы можете использовать CircuidSubnetsSerializer и для your_related_field.
у вас случайно нет ссылки на пример?
nested relationshipsя обновил вопрос с вложенными отношениями, однако API по-прежнему не показывает данных...
Мне нужно было выполнить предварительную выборку, чтобы она соответствовала имени поля в моем сериализаторе Prefetch('devicecircuitsubnets_set', queryset=DeviceCircuitSubnets.objects.all().select_related('subnet__subnet_type','subnet','circuit') , to_attr='circuit_subnets', )
по какой-то причине я не могу загрузить сайт django-rest-framework.org в данный момент. я не уверен, что поле с гиперссылкой - это то, что я ищу, я хочу вложенный словарь Circuit_subnets под устройством, имеет ли это смысл?