Django REST Framework:可浏览API表单中的默认字段

Nei*_*eil 10 django django-rest-framework

我有一个模特:

class XCall(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)
    send_on = models.DateTimeField(default=datetime.now)
    recipient = models.ForeignKey(User)
    text = models.CharField(max_length=4096)
    backup_calls = models.IntegerField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

并为该模型的序列化器:

class CallSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='call-detail',
    )
    # some validation and custom field definitions
    ...

    class Meta:
        model = XCall
        fields = ('url', 'id', 'text', 'recipient', 'send_on', 'backup_calls', 'status')
        lookup_field= 'pk'
Run Code Online (Sandbox Code Playgroud)

这是列表视图:

class CallList(generics.ListCreateAPIView):
    serializer_class = CallSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrSuperuser,)

    def pre_save(self, obj):
        auth_user = self.request.user
        obj.auth_user = auth_user

    def get_queryset(self):
        """
        This view should return a list of all the calls
        for the currently authenticated user.
        """
        auth = self.request.user
        if isinstance(auth, AnonymousUser):
            return []
        elif auth.is_superuser:
            return XCall.objects.all()
        else:
            return XCall.objects.filter(auth_user=auth)
Run Code Online (Sandbox Code Playgroud)

在可CallList浏览的API中,我在底部的POST表单中看到以下内容: 在此输入图像描述

我的问题是:为什么没有设置默认值send_on,有一个用于backup_calls?我假设表单将遵循XCall模型规范并datetime.now()用于默认前者,并backup_calls留空(因为它可以为空).如何让表格符合模型规格?

aqu*_*tae 2

模型默认值和表单中的初始值之间存在区别。对于实际上是函数的默认值尤其如此,因为它们仅在保存实例时才会被调用。例如,now您想要哪一个 - 显示空白表单的时间,还是用户按下“POST”的时间?如果字段值缺失,Django 在保存模型时会应用默认值。要实现您想要的效果,您需要在序列化字段中手动设置默认值,例如:

class CallSerializer(serializers.HyperlinkedModelSerializer):
    send_on = serializers.DateTimeField(default=datetime.now)
    ...
Run Code Online (Sandbox Code Playgroud)