【问题标题】:Automatic 'created by user' field using django-rest-framework?使用 django-rest-framework 自动“由用户创建”字段?
【发布时间】:2016-11-28 02:45:15
【问题描述】:

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)

我想要达到的目标:

added_by 应该:

  1. 设置在createNugget
  2. 默认为创建Nuggetuser,无法覆盖此默认值
  3. 在检索到 Nugget 时包含并显示
  4. 在可浏览的 API 中不会显示为 create/POST 的选项
  5. create 之后不可编辑

【问题讨论】:

  • 只需从序列化程序中完全删除added_by,并防止它使用exclude 自动生成。您仍然可以在保存时传递它,传递给 save 的 kwarg 被简单地复制到模型中。
  • @spectras 如果我exclude added_by,那么它不符合要求3。

标签: python django django-models django-rest-framework


【解决方案1】:

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

CurrentUserDefault() 需要 requestcontext 字典中。在这种情况下,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()

【讨论】:

  • 很好,您能够解决您的问题。如果它解决了您的问题,您可以接受自己的答案。
【解决方案2】:

我是通过以下方式完成的(无需使该字段为空):

models.py

class Nugget(models.Model):
    added_by = models.ForeignKey(to=User, related_name='added_by', on_delete=models.DO_NOTHING)

serializers.py

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

    class Meta:
        model = Nugget
        fields = ['added_by']

views.py

class NuggetList(viewsets.ModelViewSet):
    queryset = Nugget.objects.all()
    serializer_class = NuggetSerializer

    def perform_create(self, serializer):
        request = serializer.context["request"]
        serializer.save(added_by=request.user)

【讨论】:

    【解决方案3】:

    我必须更新 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)
    

    【讨论】:

    • 这应该是公认的答案,因为它不需要您的模型字段可以为空和可空白。其他解决方案需要您将该字段设置为可为空,这可能会导致数据库长期不一致。
    猜你喜欢
    • 2013-11-15
    • 2023-03-12
    • 2017-08-22
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多