Django Rest Framework:无法使用视图名称“post-detail”解析超链接关系的 URL

Mat*_*viy 2 python django backend django-serializer django-rest-framework

我找到了很多类似问题的答案,但没有一个对我有帮助。我是后端和 Django 的新手,我已经花了几天时间试图弄清楚我做错了什么,但没有成功。我将非常感谢任何帮助!因此,当我致电http://127.0.0.1:8000/users/ {user_name}/时 ,我得到:

配置不正确:无法使用视图名称“post-detail”解析超链接关系的 URL。您可能未能在 API 中包含相关模型,或者错误地配置了lookup_field该字段的属性。

如果我在任何其他字段上更改HyperlinkedRelatedField,它就会正常工作......

urls.py

 app_name = 'api'
urlpatterns = [
        url(r'^posts/(?P<post_id>\d+)/$', PostDetails.as_view(),
            name='post-detail'),
        url(r'^users/(?P<username>[\w\-]+)/$', UserPosts.as_view()),
    ]
Run Code Online (Sandbox Code Playgroud)

视图.py

class PostDetails(APIView):
    """
        - GET a post

    """

    def get(self, request, post_id):

        post = Post.objects.get(id=post_id)
        post_serializer = PostSerializer(post)

        return Response(post_serializer.data)

class UserPosts(APIView):
    """
        GET all user posts
    """

    def get(self, request, username):
        user = User.objects.get(username=username)
        serializer = UserSerializer(user, context={'request': request})
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

序列化器.py

  class UserSerializer(serializers.ModelSerializer):
    posts = serializers.HyperlinkedRelatedField(many=True,
                                                read_only=True,
                                                view_name='post-detail',
                                                lookup_field='id')
    #  Mandatory for UUID serialization
    user_id = serializers.UUIDField()

    class Meta:
        model = User
        exclude = ('id', 'password')
        read_only_fields = ('created', 'username', 'posts',)


class PostSerializer(serializers.ModelSerializer):

    author = UserSerializer()

    class Meta:
        model = Post
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

模型.py

     class User(models.Model):
   username = models.CharField(max_length=30, unique=True)
   password = models.CharField(max_length=50)
   email = models.EmailField(unique=True)
   first_name = models.CharField(max_length=30)
   last_name = models.CharField(max_length=30)
   phone = models.CharField(max_length=20, blank=False, unique=True)
   user_id = models.UUIDField(editable=False,
                           unique=True,
                           null=False,
                           db_index=True,)
  created = models.DateTimeField()
  id = models.BigAutoField(primary_key=True)

  class Meta:
      ordering = ('created',)

  def __unicode__(self):
      return "Email: %s " % self.email


class Post(models.Model):
   created = models.DateTimeField()
   is_active = models.BooleanField(default=False)
   title = models.CharField(max_length=200, blank=False)
   body_text = models.CharField(max_length=1000, blank=False)
   address = models.CharField(max_length=100)
   author = models.ForeignKey(User, on_delete=models.PROTECT,
                           related_name='posts')
   price = models.DecimalField(max_digits=10, decimal_places=0)
   id = models.BigAutoField(primary_key=True)

  class Meta:
      ordering = ('created',)

  def __unicode__(self):
      return "Title : %s , Author:  %s  " % (self.title, self.author)
Run Code Online (Sandbox Code Playgroud)

Gab*_*Muj 5

lookup_field的网址与您的网址不匹配post_id

url(r'^posts/(?P<post_id>\d+)/$', PostDetails.as_view(),
        name='post-detail'),
Run Code Online (Sandbox Code Playgroud)

来自文档:

  • Lookup_field - 目标上应该用于查找的字段。应对应于引用视图上的 URL 关键字参数。默认为“pk”。
  • lookup_url_kwarg - URL conf 中定义的与查找字段对应的关键字参数的名称。默认使用与lookup_field相同的值。

所以你应该对此没问题:

posts = serializers.HyperlinkedRelatedField(many=True,
                                            read_only=True,
                                            view_name='post-detail',
                                            lookup_url_kwarg='post_id')
Run Code Online (Sandbox Code Playgroud)