2015-10-13 21 views
1

我使用Django rest框架3.2.1,GET是完美的,但POST不起作用。發佈到Django rest框架API,但總是得到'此字段是必需的'錯誤

這是型號:

class Sample(models.Model): 
    ownerBuilding = models.ForeignKey(Building) 
    coordinateX = models.IntegerField(default=0, help_text='X coordinate for this sampling point located in a building') 
    coordinateY = models.IntegerField(default=0, help_text='Y coordinate for this sampling point located in a building') 
    creation_Time = models.DateTimeField(auto_now_add=True) 
    description = models.TextField(null=True, 
           help_text='additional description for this sample point.') 

class Meta: 
    unique_together = ('ownerBuilding', 'coordinateX','coordinateY') 

def __str__(self): 
    return "Sample for building " + str(self.ownerBuilding) 

的串行:

class SampleSerializer(serializers.HyperlinkedModelSerializer): 
    ownerBuilding = serializers.HyperlinkedRelatedField(many=False, read_only=True, view_name='building-detail') 

class Meta: 
    model = Sample 
    fields = ('url', 'ownerBuilding', 'coordinateX', 'coordinateY', 'creation_Time','description') 

的觀點:

class SampleList(generics.ListCreateAPIView): 
    queryset = Sample.objects.all() 
    serializer_class = SampleSerializer 
    permission_classes = (permissions.IsAuthenticated, IsTechniciansGroupOrReadOnly,) 

    def get_queryset(self): 
     queryset = Sample.objects.all() 
     ownerBuildingId = self.request.query_params.get('ownerBuildingId', None) 

     if ownerBuildingId is not None: 
      queryset = queryset.filter(ownerBuilding=ownerBuildingId) 

     return queryset 

當我測試POST這個API數據:

{"ownerBuilding":"http://rest.xxxxxxxx.xyz:8090/buildings/1/","coordinateX":33,"coordinateY":44,"description":"5dfadfasdfsadf5"} 

我總是得到這樣的錯誤:

{ 
    "ownerBuilding": [ 
     "This field is required." 
    ] 
} 

有人可以幫助?

http://rest.xxxxxxxx.xyz:8090/buildings/1/存在。

[edit0]: 如果我POST有:

{"coordinateX":33,"coordinateY":44,"description":"5dfadfasdfsadf5"} 

我仍然得到同樣的結果。

+0

沒有'ownerBuilding'的帖子不會幫助,它仍然是必需的。 – Ivan

回答

0

串行器字段是required by default

另外,DRF ModelSerializer(和HyperlinkedModelSerializer)爲所有型號的unique_together約束添加了UniqueTogetherValidator s。這隱含地使所需的約束中的所有字段,除了設置了默認值的字段以外。見doc

ownerBuilding是隻讀的串行:

ownerBuilding = serializers.HyperlinkedRelatedField(many=False, \ 
          read_only=True, view_name='building-detail') 

,但你不提供defualt也不手動設定值,所以這個領域被視爲空的,因此錯誤消息。

刪除read_only或設置默認值。

相關問題