python - 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)
我错过了什么?我的帖子与导致此问题的类似视图/序列化程序之间有什么区别?
解决方案
推荐阅读
- java - 在 Android 上使用哪个 JCE 提供程序?充气城堡,Conscrypt,...?
- php - 使用 grep -v 和 shell_exec 时如何修复我的通配符语法
- asp-classic - 如何在 ASP Classic JScript 中获取受影响的行?
- laravel - Eloquent 从中间表中获取一张表
- vba - 如果单元格为空白,则删除整行
- java - Spring JPA 无法在一个线程中正确处理多个事务
- spring - org.springframework.batch.item.ItemStreamException:文件不可写:Spring Batch
- java - 使用 Web 应用程序时出现 java.lang.NullPointerException
- cmake - 为posix版本添加MinGW路径
- java - rx java obsever pojo model for change