Django REST框架。通过唯一网址获取对象

时间:2017-02-12 15:02:34

标签: django rest django-rest-framework

我为移动客户端做了django项目的休息api。

我有 Categories 对象的这个模型和API结构:

models.py

class Category(models.Model):
    title = models.CharField(max_length=200, verbose_name="Title")
    url = models.CharField(max_length=200, verbose_name="Url")

api / serializers.py

class CategoryDetailSerializer(ModelSerializer):

    class Meta:
        model = Category
        fields = [
            'id',
            'title',
            'url'
        ]       

api / views.py

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategoryDetailSerializer

和api / urls.py

urlpatterns = [
    url(r'^(?P<pk>\d+)/$', CategoryViewSet.as_view({'get': 'retrieve'}), name='detail'),
]

要检索类别对象,我使用GET请求my_server_url/api/categories/[pk]/

问题是如何使用它url字段获取对象(这是唯一的)。例如像这样: my_server_url/api/categories/category_1/ 是否可以使用rest-framework?

或者我可能先获取[pk]:[url]对象的地图,然后通过url获取pk并将其传递给现有的请求方法..?

1 个答案:

答案 0 :(得分:0)

您可以在视图中设置lookup_field。

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategoryDetailSerializer
    lookup_field = 'url'

您还需要将网址正则表达式更改为:

urlpatterns = [
    url(r'^(?P<url>[-\w]+)/$', CategoryViewSet.as_view({'get': 'retrieve'}), name='detail'),
]

但是我建议将唯一字段存储为子区域https://docs.djangoproject.com/en/1.10/ref/models/fields/#slugfield,这样您就可以确保它是一个有效的网址。