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

时间:2013-12-10 06:30:16

标签: 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)

该模型的序列化器:

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'

以下是列表视图:

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)

CallList的可浏览API中,我在底部的POST表单中看到以下内容: enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

class CallSerializer(serializers.HyperlinkedModelSerializer):
    send_on = serializers.DateTimeField(default=datetime.now)
    ...

答案 1 :(得分:2)

您实际上想要设置initial值,而不是默认值。请参阅docs。你的代码应该是:

from django.utils import timezone


class CallSerializer(serializers.HyperlinkedModelSerializer):
    send_on = serializers.DateTimeField(initial=timezone.now())
    ...

默认值是如果没有为字段设置值,则为属性提供的值。 initialdefault参数之间的区别反映了Django对表单字段的initial参数与模型字段的Django default参数之间的区别。