Django: ожидаемое представление likeList будет вызываться с аргументом ключевого слова URL с именем "id" - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался создать API, который бы возвращал все объекты из Like model, однако я получил ошибку (Ожидается, что представление likeList будет вызываться с аргументом ключевого слова URL-адреса с именем "id". Исправьте свой URL-адрес conf или установите .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()

URLS

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'),
]

As из-за ошибки я должен либо исправить свой URL conf, либо правильно установить атрибут .lookup_field в представлении. Однако, если я изменю свой URL-адрес, он будет работать как положено, если я использую только поле 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)

Чего мне не хватает? В чем разница между моим постом и аналогичными представлениями / сериализаторами, которые вызывают эту проблему?

...