2013-12-10 21 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模型字段參數之間的區別。