首页 > 解决方案 > Django:使用名为“id”的 URL 关键字参数调用预期的视图 likeList

问题描述

我一直在尝试创建一个返回所有对象的 API,Like model但是,我收到一个错误(预期视图 likeList 将使用名为“id”的 URL 关键字参数调用。修复您的 URL 配置,或.lookup_field正确设置视图上的属性。 )。

这是我的模型

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    objects = models.Manager()
    image = models.ImageField(upload_to='post_pics')

    def __str__(self):
        return self.title

    @property
    def useremail(self):
        return self.author.email

    @property
    def owner(self):
        return self.author

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk':self.pk})

   def get_api_url(self, request=None):
        return api_reverse('post-detail', kwargs={'pk': self.pk}, request=request)

    def get_like_count(self):
        return self.like_set.count()

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

串行器

class likeserializers(serializers.ModelSerializer):
    username = serializers.SerializerMethodField(read_only=True)
    post_title = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Like
        fields = ('id','created',
                    'user','username',
                    'post','post_title')

    def get_username(self, obj):
        return obj.user.username 

    def get_post_title(self, obj):
        return obj.post.title

意见

class likeList(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'id'
    serializer_class = likeserializers

    def get_queryset(self):
        return Like.objects.all()

网址

urlpatterns = [
    path('users/', API_views.userList.as_view(), name = 'users'),
    path('users/id=<int:id>/', API_views.userListbyID.as_view(), name = 'usersid'),
    path('posts/', API_views.postList.as_view(), name = 'post'),
    path('posts/id=<int:id>', API_views.postListbyID.as_view(), name = 'postid'),
    path('likes/', API_views.likeList.as_view(), name = 'likes'),
    path('likes/id=<int:id>', API_views.likeListbyID.as_view(), name = 'likesid'),
    path('follows/', API_views.followList.as_view(), name = 'likes'),
    path('follows/id=<int:id>', API_views.followListbyID.as_view(), name = 'likesid'),
]

根据错误,我应该修复我的 URL conf,或者.lookup_field正确设置视图上的属性。如果我更改我的 URL conf,它会按预期工作,但是,如果我只使用 lookup_field 它可以解决问题。我对帖子有完全相同的看法,而且它有效。

后序列化程序:

class postserializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField(read_only=True)
    like_count = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Post
        fields = ('url','id',
                    'title','content',
                    'date_posted','author',
                    'useremail','like_count')

    def get_url(self,obj):
        request = self.context.get("request")
        return obj.get_api_url(request=request)

    def get_like_count(self,obj):
        return obj.get_like_count()

    def validate_title(self,value):
        qs = Post.objects.filter(title__iexact = value)

        #exclude the same instance
        if self.instance:
            qs = qs.exclude(pk=self.instance.pk)

        #if title already exists raise error
        if qs.exists():
            raise serializers.ValidationError(f"Post with title '{value}' already exists")
        return value

并发布视图:

class postList(mixins.CreateModelMixin, generics.ListAPIView):
    lookup_field = 'id'
    serializer_class = postserializer
    permission_classes = [IsOwnerOrReadOnly]

    # permissions can be set up here as well + in settings.py
    # permission_classes = 

    def get_queryset(self):
        qs = Post.objects.all()
        query = self.request.GET.get("q")
        if query is not None:
        qs = qs.filter(
                Q(title__icontains = query)|
                Q(content__icontains = query)
                ).distinct()
        return qs

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

我错过了什么?我的帖子与导致此问题的类似视图/序列化程序之间有什么区别?

标签: pythondjangodjango-rest-frameworkdjango-serializer

解决方案


推荐阅读