1

同様の問題に対する多くの回答が見つかりましたが、 私はバックエンドとDjangoを初めて使っています。私は数日間、私が間違っていることを理解しようとしましたが、成功しませんでした。 私はどんな助けもありがとう! だから、私が呼ぶときhttp://127.0.0.1:8000/users/ {USER_NAME}/ 私は取得しています:Django Rest Framework:ビュー名 "post-detail"を使用してハイパーリンクされたリレーションシップのURLを解決できませんでした。

ImproperlyConfigured:ビュー名 "ポスト・ディテール" を使用して、ハイパーリンクの関係のための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()), 
    ] 

views.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) 

serializer.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__' 

models.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) 

答えて

0

あなたlookup_fieldあなたのURLと一致していないドキュメントからpost_id

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

である1:

  • lookup_field - ルックアップに使用するターゲット上のフィールド。参照先ビューのURLキーワード引数に対応する必要があります。デフォルトは 'pk'です。
  • lookup_url_kwarg - ルックアップフィールドに対応する、URLconfで定義されたキーワード引数の名前。デフォルトでは、lookup_fieldと同じ値を使用します。

だから、これで問題ないはず:

posts = serializers.HyperlinkedRelatedField(many=True, 
              read_only=True, 
              view_name='post-detail', 
              lookup_url_kwarg='post_id') 
+0

おかげで、それが働いています! –

関連する問題