2013-12-10 22 views
10

默认字段我有一个模型:Django的REST框架:在浏览的API形式

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留空(因为它可以为空)。我怎样才能让表单遵循模型规范?

+0

你有没有解决过这个问题?我目前正在遇到它。 – user2734679

回答

3

表单中的模型默认值和初始值之间存在区别。对于默认值来说尤其如此,因为它们仅在实例保存时才被调用。例如,您希望使用哪一个now--这是显示空白表单的时间,还是用户按下“POST”的时间?如果字段值缺失,Django在保存模型时应用默认值。为了达到你想要什么,你需要手动设置默认的连载领域,例如:

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

我不确定我看到您描述的行为。当我尝试发布没有send_on填充时,我收到验证错误“此字段是必需的”。如果你说Django在保存时应用默认值,为什么验证错误?其他一些信息:1)我在Django 1.6上;我依稀记得在我从1.4升级之前,所有这些工作都有所不同。 2)奇怪的是,我看到默认的表单值按照我在Django开发模式中的预期工作,但在我的生产环境(Django + Apache + mod_wsgi)中没有。 – Neil

+0

此外,这个答案并不能解释为什么我看到'backup_calls'字段的默认值。我没有明确地将它设置在IIRC的CallSerializer' – Neil

+1

中,字段验证首先发生在表单中。表单看到send_on中没有输入任何内容,它是必需的,根据表单字段没有默认值,所以在进入模型之前会引发异常。我不知道为什么它在生产中会有不同的工作方式 - 听起来像是一些奇怪的缓存问题。 – aquavitae

2

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

from django.utils import timezone 


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

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