访问Django rest fram中的用户

2024-03-29 04:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在项目中使用django rest框架。你知道吗

我有一个gallery模型,它有一个user字段。此字段是创建库的用户的外键。以及name字段,它是库的名称。你知道吗

class Gallery(models.Model):
    user = models.ForeignKey(User,related_name='galleries')
    name = models.CharField(max_length=64)

这是我的序列化程序:

class GallerySerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')

    def validate_name(self, name):
        if len(name) < 3:
            raise serializers.ValidationError("name must at least 3 letters")
        return name
    class Meta:
        model = Gallery
        fields = ('id', 'user', 'name',)

    def create(self, validated_data):
        """
        Create and return a new `Gallery` instance, given the validated data.
        """
        return Galleries.objects.create(**validated_data)

这是我的views

class GalleryList(generics.ListCreateAPIView):
    queryset = Gallery.objects.all()
    serializer_class = GallerySerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

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


class GalleryDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Gallery.objects.all()
    serializer_class = GallerySerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

我想验证post(和put)数据,并阻止用户创建两个同名库。(如果“用户A”有一个“库A”,则他无法创建同名库或将另一个库重命名为“库A”)。但是“用户B”可以创建一个“gallery a”)

为此,我需要检查user.galleries.filter(name=name)是否存在。你知道吗

但我不知道如何在序列化程序中获取user。你知道吗


Tags: 用户nameselfdatareturnmodelsdefcreate
1条回答
网友
1楼 · 发布于 2024-03-29 04:54:43

您可以从传递给序列化程序的上下文中获得它。这是为您自动完成的,因此您可以这样访问它:

user = self.context['request'].user

如果希望能够指定其他用户,可以自己将其添加到上下文中:

# This method goes in your view/viewset
def get_serializer_context(self):
    context = super().get_serializer_context()
    context['user'] = #whatever you want here
    return context

这将使用户可以作为self.context['user']使用。这有点冗长,但它更通用,因为它允许序列化程序被传递给不同于请求者的用户。你知道吗

相关问题 更多 >