Django Rest Framework:执行create re时,在post数据中不需要使用序列化字段

时间:2017-07-24 19:57:09

标签: django-rest-framework

我有以下设置:

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)

在代码段中,我在视图的creator方法中设置了QuoteModel perform_create字段。由于QuoteListCreateView是经过身份验证的视图,因此,我不希望在引用创建请求期间传递creator(发布到/quotes)。 creator是序列化程序类的一部分,如果我没有通过创建者,则post请求返回以下内容。 “创造者”:[     “这是必填栏。”   ]“

因此,我的质询是 -    无论如何要在帖子请求中使creator参数可选吗?我无法在model.py中的null=true字段中添加creator,因为从模型角度来看它是必需的。

提前致谢。

修正

覆盖模型序列化程序中的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',)

1 个答案:

答案 0 :(得分:3)

根据您对问题的描述。具体做法是:

  

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

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

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',)