我不能通过Django Rest Framework中的id来拥有对象。我有这样的模特:
class BlogPost(models.Model):
title = models.CharField(max_length=128)
content = models.TextField()
created = models.DateTimeField(auto_now_add=True)
然后我写了一个序列化器:
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
fields = ('title', 'content', 'created')
在我的views.py
我有这个:
class BlogPostListFilter(dajngo_filter.FilterSet):
blog_post_id = django_filters.NumerFilter(name = 'id')
class Meta:
model = BlogPost
fiields = ['blog_post_id']
class BlogPostList(generics.ListCreateAPIView):
queryset = BlogPost.objects.all()
serializer_class = BlogPostSerializer
permission_classes = (AllowAny,)
filter_class = BlogPostListFilter
paginate_by = 100
我的网址中有这样的代码:
url(r'^blogpost/$', ListCreateAPIView.as_view(model=BlogPost), name='blogpost-list'),
但是当我在浏览器中写http://example.com/blogpost/?blog_post_id=1时,我有所有对象
答案 0 :(得分:3)
在我的案例中,我偶然发现了这个问题,希望在覆盖ModelViewSet的检索方法时访问对象ID。经过一些研究和实验,我发现对象id存储在'pk'
键中的名为self.kwargs的字典中。
我正在使用djangorestframework == 3.11.0。
class MealItemViewSet(viewsets.ModelViewSet):
queryset =MyModel.objects.all()
serializer_class = serializers.MyModelSerializer
def retrieve(self, request, *args, **kwargs):
# The Primary Key of the object is passed to the retrieve method through self.kwargs
object_id = self.kwargs['pk']
我希望这个答案在某个时候能帮助另一个不幸的StackOverflow流浪者!
答案 1 :(得分:2)
如果你真的想使用ListCreateAPIView
。你需要做一些改变:
<强> urls.py 强>:
url(r'^blogpost/(?P<post_id>\w+)$', views.BlogPostList.as_view(),name='blogpost-list'),
<强> views.py 强>
class BlogPostList(generics.ListCreateAPIView):
serializer_class = BlogPostSerializer
permission_classes = (AllowAny,)
filter_class = BlogPostListFilter
paginate_by = 100
def get_queryset(self):
queryset = BlogPost.objects.filter(pk=self.kwargs['post_id'])
return queryset
但我认为Django Rest Framework为您的用例提供了更好的基于类的视图,例如RetrieveAPIView
。据我所知,似乎你只想获得一个对象,这个通用视图是用于一个对象列表。