2017-02-10 70 views
0

我有大型数据表(〜30 Mb),我将它转换为Django中的模型。现在我想通过REST API访问这些数据。Django rest框架:为模型的每个字段自动创建一个url

我已经成功安装了Django REST框架,但我正在寻找一种方法来为我的模型中的每个字段自动创建一个URL。我的模型有大约100个字段,每个字段大约有100,000个条目。

如果我的模型被命名为样品,

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列出所有名称等。 请帮我弄清楚如何做到这一点,谢谢!

回答

1

您可能可以使用自定义视图集路线来完成此操作。

你有这样的:

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'

例如。

在你的问题中有很多有趣的细节,但对于这个例子,我认为你可能能够实现你想要的。

+0

谢谢您的答复。我对你的代码后URL映射的工作方式有些困惑。我是否也需要更改此代码? 'router = routers.DefaultRouter() router.register(r'sample',SampleViewSet)' –

+0

无需使用更改路由器注册表。该URL源自用list_route装饰器装饰的方法名称。 –

0

尝试使用分页。你可以用几乎相同的方式来做到这一点。在Django的分页可以让你将结果分成页面。您不必在同一页面中显示所有条目。我认为这对你来说是最好的选择。

参见上分页Django文档: Pagination in django

+0

他遇到的问题是不同的。他需要从他的所有样本中挑选一个特定的领域,并一次性得到它们。 –

相关问题