使用django-rest-framework自动“由用户创建”字段?

问题描述 投票:3回答:2

models.py

class Nugget(TimeStampedModel):
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name='added_by', blank=True, null=True)

serializers.py

class NuggetSerializer(TaggitSerializer, serializers.ModelSerializer):
    added_by = serializers.CreateOnlyDefault(default=serializers.CurrentUserDefault())

views.py

class NuggetList(generics.ListCreateAPIView):
    queryset = Nugget.objects.all()
    serializer_class = NuggetSerializer

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

What I'm trying to achieve:

added_by应该:

  1. 设置在createNugget
  2. 默认为创建userNugget,无法覆盖此默认值
  3. 在检索Nugget时包括并显示
  4. 不会在可浏览的API中显示为create/POST的选项
  5. create之后不可编辑
python django django-models django-rest-framework
2个回答
3
投票

改变了added_by中的serializers.py(未使用字段,并设置为read_only)和.save()中的views.py以阻止覆盖默认值。

CurrentUserDefault()request dict中要求context。在这种情况下,generics.ListCreateAPIView已经这样做了。

models.py

class Nugget(TimeStampedModel):
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name='added_by', blank=True, null=True)

serializers.py

class NuggetSerializer(TaggitSerializer, serializers.ModelSerializer):
        added_by = serializers.StringRelatedField(default=serializers.CurrentUserDefault(), read_only=True)

views.py

class NuggetList(generics.ListCreateAPIView):
    queryset = Nugget.objects.all()
    serializer_class = NuggetSerializer

    def perform_create(self, serializer):
        serializer.save()

0
投票

我必须更新views.py才能使其正常工作:

class NuggetList(generics.ListCreateAPIView):
    queryset = Nugget.objects.all()
    serializer_class = NuggetSerializer
    permission_classes = (IsAuthenticated,)


    def perform_create(self, serializer):
        req = serializer.context['request']
        serializer.save(added_by=req.user)
© www.soinside.com 2019 - 2024. All rights reserved.