Django rest framework: автоматически создавать URL для каждого поля модели

У меня есть большая таблица данных (~ 30 МБ), которую я преобразовал в модель в Django. Теперь я хочу иметь доступ к этим данным через REST API.

Я успешно установил инфраструктуру Django REST, но я ищу способ автоматического создания URL-адреса для каждого поля в моей модели. В моей модели около 100 полей, и каждое поле содержит около 100 000 записей.

Если моя модель называется Sample,

models.py

class Sample(models.Model):
    index = models.IntegerField(primary_key=True)
    year = models.IntegerField(blank=True, null=True)
    name = models.TextField(blank=True, null=True)
    ...97 more fields...

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

urls.py
class SampleSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Sample
        fields = ( **100 fields**)

class SampleViewSet(viewsets.ModelViewSet):
    queryset = Sample.objects.all()
    serializer_class = SampleSerializer

router = routers.DefaultRouter()
router.register(r'sample', SampleViewSet)

Но, конечно же, мой браузер не может загрузить все эти данные за разумное время. Я мог бы вручную создать другой класс и URL-адрес для каждого поля, но должен быть лучший способ... Я хочу иметь возможность перейти на my_site.com/sample/year (например) и получить список всех лет в формате JSON или my_site.com/sample/name и перечислите все имена и т. д. Пожалуйста, помогите мне понять, как это сделать, спасибо!


person Nic Scozzaro    schedule 10.02.2017    source источник


Ответы (2)


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

У вас есть это:

class ModelViewSet(ModelViewSet):

    @list_route()
    def sample_field(self, request):
        desired_field = request.data.get('field', None)
        if not desired_field:
            return response # pseudocode

        values = Model.objects.all().values_list(desired_field, flat=True)
        # serialize this for returning the response
        return Response(json.dumps(values))  # this is an example, you might want to do something mode involved

Вы сможете получить это по URL-адресу:

/api/model/sample_field/?field=foo

Этот дополнительный метод в наборе представлений создаст новую конечную точку под конечной точкой образцов. Поскольку это list_route, вы можете добраться до него, используя /sample_field.

Итак, следуя вашему коду, это будет:

mysite.com/sample/sample_field/?field='year'

Например.

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

person George Silva    schedule 10.02.2017
comment
Благодарю за ваш ответ. Я немного смущен тем, как сопоставление URL-адресов будет работать после вашего кода. Мне также нужно изменить этот код? router = routers.DefaultRouter() router.register(r'sample', SampleViewSet) - person Nic Scozzaro; 10.02.2017
comment
Нет необходимости использовать изменение реестра маршрутизатора. URL-адрес получен из имени метода, украшенного декоратором list_route. - person George Silva; 10.02.2017

Попробуйте использовать пагинацию. Вы можете сделать это почти так же, как в вашем вопросе. Пагинация в django позволяет разделить результаты на страницы. Вам не обязательно отображать все записи на одной странице. Я думаю, что это лучший вариант для вас.

См. документацию django по разбиению на страницы: Разбиение на страницы в django

person Mohammed Shareef C    schedule 10.02.2017
comment
проблема у него другая. ему нужно выделить конкретное поле из всех своих образцов и получить их все сразу. - person George Silva; 10.02.2017