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
我有大量 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