API 视图返回 { "detail": "Not found." },
API view returning { "detail": "Not found." },
class User(models.Model):
user_id = models.CharField(max_length=255, unique=True)
mobile = models.CharField(max_length=12)
first_name = models.CharField(max_length=200, null=True)
last_name = models.CharField(max_length=200, null=True)
profile_image = models.URLField(null=True)
email = models.EmailField(null=True)
posts = models.ManyToManyField('uploads.Posts', related_name='post_user')
created_on = models.DateTimeField(default=timezone.localtime)
updated_on = models.DateTimeField(default=timezone.localtime)
is_deleted = models.BooleanField(default=False)
class Posts(models.Model):
url = models.URLField(null=True)
description = models.TextField()
created_on = models.DateTimeField(default=timezone.localtime)
updated_on = models.DateTimeField(default=timezone.localtime)
is_deleted = models.BooleanField(default=False)
这些是我的模型,我为 Posts 创建了一个序列化程序并将其嵌套在 UserPostSerializer 下。
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Posts
exclude = ('id', 'created_on', 'updated_on', 'is_deleted')
class UserPostsSerializer(serializers.ModelSerializer):
posts = PostSerializer(many=True)
class Meta:
model = User
fields = ('user_id', 'posts',)
但是,当我创建这样的视图时:
class UserPostsView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserPostsSerializer
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
response = Response(serializer.data)
return response
我的APIreturns{ "detail": "Not found." }
理想情况下,视图应列出所有用户及其帖子。
类似于:
{
"user_id": "abcd",
"posts": {
"url": "http:....com",
"description": "Lorem ipsum"
}
}
问题出在 URL 的顺序上,我是这样称呼它的:
urlpatterns = [
path('list', UserListView.as_view(), name='user list'),
path('<str:id>', UserDetailView.as_view(), name='user detail'),
path('posts', UserPostsView.as_view(), name='user posts')]
这样它将我的请求映射到 UserDetailView,因为 < str:id > 是一个 catch-all 并且在 'posts' 之前被调用,Django 试图找到一个具有 user_id 'posts'。
我的 UserPostsView 的 URL 应该在我的 UserDetailView 的 URL 之前,例如:
urlpatterns = [
path('list', UserListView.as_view(), name='user list'),
path('posts', UserPostsView.as_view(), name='user posts'),
path('<str:id>', UserDetailView.as_view(), name='user detail')]
这修复了错误,我能够看到所需格式的数据。
class User(models.Model):
user_id = models.CharField(max_length=255, unique=True)
mobile = models.CharField(max_length=12)
first_name = models.CharField(max_length=200, null=True)
last_name = models.CharField(max_length=200, null=True)
profile_image = models.URLField(null=True)
email = models.EmailField(null=True)
posts = models.ManyToManyField('uploads.Posts', related_name='post_user')
created_on = models.DateTimeField(default=timezone.localtime)
updated_on = models.DateTimeField(default=timezone.localtime)
is_deleted = models.BooleanField(default=False)
class Posts(models.Model):
url = models.URLField(null=True)
description = models.TextField()
created_on = models.DateTimeField(default=timezone.localtime)
updated_on = models.DateTimeField(default=timezone.localtime)
is_deleted = models.BooleanField(default=False)
这些是我的模型,我为 Posts 创建了一个序列化程序并将其嵌套在 UserPostSerializer 下。
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Posts
exclude = ('id', 'created_on', 'updated_on', 'is_deleted')
class UserPostsSerializer(serializers.ModelSerializer):
posts = PostSerializer(many=True)
class Meta:
model = User
fields = ('user_id', 'posts',)
但是,当我创建这样的视图时:
class UserPostsView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserPostsSerializer
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
response = Response(serializer.data)
return response
我的APIreturns{ "detail": "Not found." }
理想情况下,视图应列出所有用户及其帖子。 类似于:
{
"user_id": "abcd",
"posts": {
"url": "http:....com",
"description": "Lorem ipsum"
}
}
问题出在 URL 的顺序上,我是这样称呼它的:
urlpatterns = [
path('list', UserListView.as_view(), name='user list'),
path('<str:id>', UserDetailView.as_view(), name='user detail'),
path('posts', UserPostsView.as_view(), name='user posts')]
这样它将我的请求映射到 UserDetailView,因为 < str:id > 是一个 catch-all 并且在 'posts' 之前被调用,Django 试图找到一个具有 user_id 'posts'。 我的 UserPostsView 的 URL 应该在我的 UserDetailView 的 URL 之前,例如:
urlpatterns = [
path('list', UserListView.as_view(), name='user list'),
path('posts', UserPostsView.as_view(), name='user posts'),
path('<str:id>', UserDetailView.as_view(), name='user detail')]
这修复了错误,我能够看到所需格式的数据。