Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-DRF无法发布传递主键的数据_Python_Django_Django Rest Framework - Fatal编程技术网

python-DRF无法发布传递主键的数据

python-DRF无法发布传递主键的数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我开始与Django合作,我遵循了Django Rest框架网站上提供的教程,现在我正在尝试修改教程,以完成更复杂的工作 我正在尝试为社交网络创建一个“类似”的系统。用户可以创建帖子(UserPosts)和其他用户的帖子 我通过以下方式创建新的用户帖子(使用命令行): http -a admin:Pass1234 POST http://127.0.0.1:8000/posts/ description="I'm just a random comment" 一切都很好。 问题是当我试图创建一

我开始与Django合作,我遵循了Django Rest框架网站上提供的教程,现在我正在尝试修改教程,以完成更复杂的工作

我正在尝试为社交网络创建一个“类似”的系统。用户可以创建帖子(UserPosts)和其他用户的帖子

我通过以下方式创建新的用户帖子(使用命令行):

http -a admin:Pass1234 POST http://127.0.0.1:8000/posts/ description="I'm just a random comment"
一切都很好。 问题是当我试图创建一个类似的实例时。在这种情况下,我需要传递一个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'))
]
知道发生了什么吗


谢谢

您需要从
像序列化程序那样的
中删除
post=UserPostSerializer

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

  class Meta:
    model = Like
    fields = ('id', 'owner', 'post', 'timestamp')
因此,django rest框架对相关的UserPost使用
PrimaryKeyRelatedField
(这是使用ModelSerializer的相关模型的默认值)。
然后,您可以使用
post=“1”
作为参数创建类似的条目