2016-06-15 8 views
2

私はDRFを使用しています。 マイmodels.py:Django-rest-frameworkシリアライザがモデルインスタンスの保存に失敗する

class Farm(models.Model): 
    farmer = models.ForeignKey(User, verbose_name="Farmer of this farm") 
    name = models.CharField(max_length=15, blank=False, verbose_name="Farm name", help_text="Please give a single word name for your farm.") 
    address = models.TextField(help_text="Please provide the address without the postal code", blank=False,) 
    postal_code = models.CharField(max_length=5, blank=False, default='12043') 
    size = models.DecimalField(max_digits=9, decimal_places=6, blank=False,) 

    #To add user's full name in the admin interface for better readability 
    def get_farmer_full_name(self): 
     return self.farmer.get_full_name() 

    #Works like a verbose_name but for a method 
    get_farmer_full_name.short_description = 'Farmers full name' 

マイserializers.py:

class FarmSerializer(serializers.ModelSerializer): 

    class Meta: 
      model = Farm 
      fields = ('farmer', 'name', 'address', 'postal_code', 'size') 

    def create(self, validated_data): 
     return Farm.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     instance.name = validated_data.get('name', instance.name) 
     instance.address = validated_data.get('address', instance.address) 
     instance.postal_code = validated_data.get('postal_code', instance.postal_code) 
     instance.size = validated_data.get('size', instance.size) 
     instance.save() 
     return instance 

私のviews.py:私はこのURLをurl(r'^farms/save/$', views.addFarm),当たると

@api_view(('POST',)) 
def addFarm(request): 
    data = JSONParser().parse(request) 
    farmer = Farm(farmer = request.user) 
    serializer = FarmSerializer(farmer, data=data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

は、私は新しいを保存したいです要求されたパラメータを持つファームインスタンス。私は郵便番号を使用してリクエストを送信しています。

しかし、回答として{"farmer":["This field is required."],"name":["This field is required."],"address":["This field is required."],"size":["This field is required."]}エラーが表示されます。

私の要求は、次のようになります。

enter image description here

注:最初のフィールド「農民私は、パラメータとして送信することはできませんが、私は、私はrequest.user.idとパスでそれを抽出する必要があると思いますそれだけでは、私は確信していません。

私は間違っていますか?どのようにこれを修正することができますか?

+0

あたりのように、あなたはrequest.dataの出力を投稿することができますか? – Anurag

+0

これは次のようになります:{u'size ':u'123.56'、u'postal_code ':u'12034'、u'name ':u'Lisa'、u'address ':u'lichtenau'}:郵便配達員私はRawとJsonを選択し、{ "name": "Lisa"、 "012"、 "lichtenau"、 "0120"このフィールドは必須であるとFarmerに応答する必要があります。 'farmer = farm(farmer_id = request.user)'を 'farmer = Farm(farmer = request.user)'に変更すると、print(serializer.is_valid())はFalse – Nitish

+0

を出力します。同じ? – jarussi

答えて

1

変更これはviews.py

data = {"farmer": request.user.id} 
data.update(request.data) 
serializer = FarmSerializer(data=data) 

またはあなたのEDIT

data = JSONParser().parse(request) 
data.update({"farmer": request.user.id}) 
serializer = FarmSerializer(data=data) 
+0

それは動作します!どうもありがとう! DRFにデータを保存する標準的な方法ですか?私はDRFに比較的新しいですし、以前はDRFの役に立たない選択肢だったFormsを使用しました。これを拡張してファームを更新できますか? – Nitish

+0

is_valid関数は、宣言されたフィールドタプルをチェックし、データに農家キーを送信していませんでした。 – Anurag

+0

はいはい!私はすでに更新のためにそれを使用することができます。あなたの答えはとても助けになりました。 – Nitish

関連する問題