2017-03-15 2 views
0

장고와 함께 작업하기 시작했고 Django Rest Framework 웹 사이트에서 제공하는 자습서를 따랐으며 지금은 튜토리얼을 조금 더 조정하려고합니다. 복잡한.python - DRF 기본 키를 전달하는 데이터를 게시 할 수 없습니다.

소셜 네트워크에 대해 '좋아요'시스템을 만들려고합니다. 사용자는 게시물 (UserPosts)을 만들고 다른 사용자의 게시물을 좋아할 수 있습니다.

나는 (명령 줄을 사용하여) 새로운 UserPosts 이런 식으로 만드는거야 :

http -a admin:Pass1234 POST http://127.0.0.1:8000/posts/ description="I'm just a random comment" 

을 그리고 모든 것이 잘 작동합니다. Like 인스턴스를 만들려고 할 때 문제가 발생합니다. 이 경우 나는 UserPost ID를 전달해야합니다, 그래서 새로운 주석 만들처럼 나는 같은 일을 해요 :

http -a admin:Pass1234 POST http://127.0.0.1:8000/likes/ post="1" 

을하지만이 작업을 수행 할 때 다음과 같은 오류 얻을 :

"post": { 
     "non_field_errors": [ 
      "Invalid data. Expected a dictionary, but got unicode." 
     ] 
    } 

class UserPost(models.Model): 
    owner = models.ForeignKey('auth.User', related_name='posts', on_delete=models.CASCADE) 
    timestamp = models.DateTimeField(auto_now_add=True) 
    description = models.CharField(max_length=100, blank=True, default='') 

    def save(self, *args, **kwargs): 
     options = self.description and {'description': self.description} or {} 
     super(UserPost, self).save(*args, **kwargs) 

    class Meta: 
     ordering = ('timestamp',) 


class Like(models.Model): 
    owner = models.ForeignKey('auth.User', related_name='likes', on_delete=models.CASCADE) 
    post = models.ForeignKey(UserPost, related_name='likes', on_delete=models.CASCADE) 
    timestamp = models.DateTimeField(auto_now_add=True) 

    def save(self, *args, **kwargs): 
     options = self.post and {'post': self.post} 
     super(Like, self).save(*args, **kwargs) 

    class Meta: 
     ordering = ('timestamp',) 

시리얼 :

class UserPostSerializer(serializers.HyperlinkedModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.id') 

    class Meta: 
     model = UserPost 
     fields = ('url', 'id', 'description', 'owner', 'timestamp') 


class LikeSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.id') 
    post = UserPostSerializer(source='post') 

    class Meta: 
     model = Like 
     fields = ('id', 'owner', 'post', 'timestamp') 

모델은 다음과 같습니다

지도 뷰 :

class PostViewSet(viewsets.ModelViewSet): 
    queryset = UserPost.objects.all() 
    serializer_class = UserPostSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, 
          IsOwnerOrReadOnly,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 


class LikeViewSet(viewsets.ModelViewSet): 
    queryset = Like.objects.all() 
    serializer_class = LikeSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

라우터 및 URL :

router = DefaultRouter() 
router.register(r'posts', views.PostViewSet) 
router.register(r'users', views.UserViewSet) 
router.register(r'likes', views.LikeViewSet) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 
] 

무슨 일이 일어나고의 어떤 생각?

감사합니다!

답변

0

당신은 당신의 LikeSerializer에서 post = UserPostSerializer를 제거해야합니다

class LikeSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.id') 

    class Meta: 
    model = Like 
    fields = ('id', 'owner', 'post', 'timestamp') 

은 그래서 장고 - 휴식 - 프레임 워크 (ModelSerializer와 관련 모델의 기본입니다) 관련 UserPost에 대한 PrimaryKeyRelatedField를 사용합니다.
그런 다음 post="1"과 같은 항목을 매개 변수로 만들 수 있습니다.

관련 문제