Django Rest - пользовательский сериализатор / запрос - не запрашивать набор запросов - PullRequest
0 голосов
/ 18 апреля 2019

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

File "/itapp/itapp/api/urls.py", line 12, in <module>
    router.register(r'ss_monitoring_data', views.SiteSupernetMontioringDataROView)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/routers.py", line 102, in register
    basename = self.get_default_basename(viewset)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/routers.py", line 185, in get_default_basename
    assert queryset is not None, '`basename` argument not specified, and could ' \
AssertionError: `basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.

это мой сериализатор:

class SiteSupernetMonitoringDataROSSerializer(serializers.Serializer):
      site = serializers.CharField(max_length=50)
      subnet = serializers.CharField(max_length=50)
      mask = serializers.CharField(max_length=50)
      circuits = serializers.CharField()

это вид:

class SiteSupernetMontioringDataROView(generics.ListAPIView):
    permission_classes = (IsAdminUser,) 
    serializer_class = SiteSupernetMonitoringDataROSSerializer
    paginate_by = 20

    def get_queryset(self):
        site_supernet_data = SiteSupernet.objects.filter(site__is_live=True, subnet_type__subnet_type__icontains='site aggregate').values()
        dcs_data = DeviceCircuitSubnets.objects.filter(
                                                    device__site__is_live=True, 
                                                    circuit__decommissioned=False
                                                ) \
                                                .select_related(
                                                    'device'
                                                    'device__site',
                                                    'subnet'
                                                    'circuit'
                                                ).values(
                                                    'id',
                                                    'subnet_id',
                                                    'circuit_id',
                                                    'device_id',
                                                    'device__site_id',
                                                    'circuit__name',
                                                    'subnet__subnet',
                                                    'subnet__mask'
                                                )

        for supernet in site_supernet_data:
            if 'circuits' not in supernet.keys():
                supernet['circuits']= []
            for dcs in dcs_data:
                    if dcs['device__site_id'] == supernet['site_id']:
                        supernet['circuits'].append(dcs)

        return site_supernet_data

1 Ответ

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

Вы пытаетесь зарегистрировать SiteSupernetMontioringDataROView в роутере. Это не правильный путь. ListAPIView нельзя использовать с routers. Вы должны использовать метод as_view, чтобы передать его шаблону URL. Как это

urlpatterns = [
    ...
    url('<YOUR_URL>', SiteSupernetMontioringDataROView.as_view())
]

Подробнее об определении urls здесь для вашей подходящей версии django.

...