djdjango RESTframework视图GenericAPIViewz中lookup_field的使用

        在所有可以查到的例子里面,都是使用lookup_field的默认的”pk”来查询模型类对象,但是没有看到自定义lookup_field的文章.
官方对lookup_field和lookup_url_kwarg 的解释:
        lookup_field - The model field that should be used to for performing object lookup of individual model instances. Defaults to ‘pk’. Note that when using hyperlinked APIs you’ll need to ensure that both the API views and the serializer classes set the lookup fields if you need to use a custom value.
        lookup_url_kwarg - The URL keyword argument that should be used for object lookup. The URL conf should include a keyword argument corresponding to this value. If unset this defaults to using the same value as lookup_field.

通常使用的一个方法:

# 定义model
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    bimage=models.ImageField(verbose_name='图书图片',upload_to='booktest',null=True)

# 定义模型序列化器
class BookInfoSerializerModel(serializers.ModelSerializer):
    class Meta:
        model = BookInfo
        fields = '__all__'

# 定义视图,继承GenericAPIView基类
class BookInfo_detailGenericAPIView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel

    def get(self, request, pk):
        book = self.get_object()
        serializer = self.get_serializer(book)
        return Response(data=serializer.data)

# 路由的配置:
urlpatterns = [
    url(r'^books/(?P<pk>\d+)/$', views.BookInfo_detailGenericAPIView.as_view()),
    ]

这样可以通过http://127.0.0.1:8000/books/2/ 来访问id=2 的数据详情
如何来自定义lookup_field的值实现按照任意字段去查询呢?
下面是代码:

# 定义视图,继承GenericAPIView基类
class BookInfo_detailGenericAPIView(GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializerModel
    lookup_field = 'btitle'

    def get(self, request, btitle):
        book = self.get_object()
        serializer = self.get_serializer(book)
        return Response(data=serializer.data)

# 路由的配置:
urlpatterns = [
    url(r'^books/(?P<btitle>\w+)/$', views.BookInfo_detailGenericAPIView.as_view()),
]

重写lookup_field,查询图书的title,这样get_object()就会依据’btitle’字段去数据库查询了.
这样可以通过http://127.0.0.1:8000/books/‘图书名称’/ 来访问btitle=’图书名称’ 的数据详情了

猜你喜欢

转载自blog.csdn.net/wu0che28/article/details/80981979