【问题标题】:Django Rest Framework: make a serializer field not required in post data when perform create reDjango Rest Framework:在执行创建重新时在发布数据中创建不需要的序列化器字段
【发布时间】:2017-07-24 19:57:09
【问题描述】:

我有以下设置:

Models.py

class QuoteModel(models.Model):
    """
        this model stores initial information for the Quote
    """
    quote_number = models.CharField(max_length=20,
                                    unique=True,
                                    help_text="Please use the quote number from pms",)
    description = models.CharField(max_length=200,
                                   help_text="Enter description that you might find helpful")
    creator = models.ForeignKey(User)
    date_created = models.DateField(auto_now_add=True)

Serializer.py

# Serializers define the API representation.
class QuoteModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Quote
        fields = ('id', 'quote_number', 'description', 'creator', 'date_created')
        read_only_fields = ('date_created',)

View.py

class QuoteListCreateView(generics.ListCreateAPIView):
    queryset = Quote.objects.all()
    serializer_class = QuoteModelSerializer
    permission_classes = (permissions.IsAuthenticated, )

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

在sn-p中,我在视图的perform_create方法中设置QuoteModelcreator字段。由于QuoteListCreateView 是仅经过身份验证的视图,因此,我不想在报价创建请求期间传递creator(发布到/quotes)。 creator 是序列化程序类的一部分,如果我不通过创建者,post 请求将返回以下内容。 “创造者”:[ “这是必填栏。” ]"

因此,我的问题是—— 无论如何在发布请求中使creator 参数可选?我无法在 model.py 中的 creator 字段上添加 null=true,因为从模型的角度来看这是必需的。

提前致谢。

修复

覆盖模型序列化程序中的 creator 属性并将 required 设置为 False 解决了该问题。

class QuoteModelSerializer(serializers.ModelSerializer):
    creator = serializers.PrimaryKeyRelatedField(required=False, queryset=User.objects.all())
    class Meta:
        model = Quote
        fields = ('id', 'quote_number', 'description', 'creator', 'date_created')
        read_only_fields = ('date_created',)

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    根据您对问题的描述。具体来说:

    我不想在报价创建请求期间传递创建者。

    听起来您希望创建者字段为只读,但在创建时填充。如果是这种情况,我建议您使用以下方法:

    class QuoteModelSerializer(serializers.ModelSerializer):
        creator = serializers.PrimaryKeyRelatedField(
            read_only=True,
            default=serializers.CurrentUserDefault()
        )
        class Meta:
            model = Quote
            fields = ('id', 'quote_number', 'description', 'creator', 'date_created')
            read_only_fields = ('date_created',)
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2019-04-01
      • 2020-09-10
      • 1970-01-01
      • 2015-11-09
      • 2017-03-12
      • 2017-03-04
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多