Django rest framework:自动为模型的每个字段创建一个url

Django rest framework: automatically create a url for each field of a model

我有大量 table 数据 (~30 Mb),我将其转换为 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)

但是我的浏览器当然无法在合理的时间内加载所有这些数据。我可以为每个字段手动创建不同的 class 和 URL,但必须有更好的方法......我希望能够转到 my_site.com/sample/year (例如)并让它以 JSON 格式列出所有年份,或 my_site.com/sample/name 并列出所有名称等。 请帮我弄清楚如何做到这一点,谢谢!

您也许可以使用自定义视图集路由来做到这一点。

你有这个:

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'

例如。

你的问题中有很多有趣的细节,但我认为通过这个示例,你可能能够实现你想要的。

尝试使用分页。您可以按照与您提出的问题几乎相同的方式进行操作。 django 中的分页功能可让您将结果分成几页。您不必在同一页面中显示所有条目。我认为这是最适合你的选择。

请参阅有关分页的 django 文档: Pagination in django