DRF过帐外键UserId

时间:2017-02-23 06:21:18

标签: django django-rest-framework

我正在使用django rest框架,我为一个特定用户提供了一个非常简单的Posts模型,我已按以下方式序列化。

Serializers.py

class PostSerializer(serializers.HyperlinkedModelSerializer):
    image = serializers.ImageField(max_length=None, use_url=True)
    question = serializers.CharField(required=False)
    ayes = serializers.CharField(required=False)
    nays = serializers.CharField(required=False)
    neutrals = serializers.CharField(required=False)

    class Meta:
        model = Posts
        fields = ('user','question', 'image','ayes', 'nays', 'neutrals')

我的models.py如下

class Posts(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    question = models.TextField(max_length=500, blank=True)
    image = models.ImageField('optionalImage', upload_to='images/posts/', default='/images/posts/blank.png')
    ayes = models.TextField(max_length=200, default=0)
    nays = models.TextField(max_length=200, default=0)
    neutrals = models.TextField(max_length=200, default=0)

当我尝试发布到此时,我一直收到user_id的NOT NULL完整性约束错误。因此我将context = {'request':request}添加到序列化程序,最终给出了以下错误:

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

我的views.py如下: views.py

@permission_classes((IsAuthenticated, ))
class PostsView(generics.ListCreateAPIView):
    queryset = Posts.objects.all()
    serializer_class = PostSerializer

    def get(self, request, format=None):
        snippets = Posts.objects.filter(pk=request.user.id)
        serializer = PostSerializer(snippets, many=True,context={'request': request})
        return Response(serializer.data)

    def post(self, request, format=None):
        posts = PostSerializer(data=request.data,context={'request': request})
        if posts.is_valid():
            posts.save()
            return Response("YOLO", status=status.HTTP_201_CREATED)
        else:
            return Response(posts.errors, status=status.HTTP_400_BAD_REQUEST)

当我在我的模型中为用户设置default = 0时,我的所有其他字段都已正确发布。我无法提交需要在每个帖子上保存的外键用户。我在这做错了什么?我是否遵循了正确的方法?

1 个答案:

答案 0 :(得分:1)

由于您不想发送用户,因此应将其从序列化程序的字段中删除。 接下来,您要将帖子的用户设置为当前用户。为此,您希望通过将save方法更改为:{/ p>将request.user传递给序列化程序的数据

posts.save(user=request.user)

documentationtutorial

中对此进行了解释