2016-09-20 8 views
0

ジャンゴ、残りのフレームワーク3.3.3のpython djaango休止フレームワーク3.3.3アップデートネストされたシリアライザ

を使用して、私は以前に投稿以下、ジャンゴ・残りのフレームワークを使用して、私のデータベース内の既存のデータを更新しようとしていますソリューション:django-rest-framework 3.0 create or update in nested serializer

私はかなり一般的なdjangoと残りのフレームワークはかなり新しいです。

class Clinic(models.Model): 

    name = models.TextField() 
    streetNumber = models.IntegerField() 
    unitNumber = models.CharField(max_length=10, blank=True, null=True) 
    streetName = models.CharField(max_length=50) 
    city = models.CharField(max_length=50) 
    province = models.CharField(max_length=3) 
    country = models.CharField(max_length=30) 
    postalCode = models.CharField(max_length=6) 
    phone = models.CharField(max_length=10) 

    def __str__(self): 
     return self.name 


class Time (models.Model): 

    clinic = models.ForeignKey(Clinic, related_name='times') 
    appointmentTime = models.CharField(max_length=100) 

    def __str__(self): 
     return self.appointmentTime 

そして、次のシリアライザ:

class TimeSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Time 
     fields = ('appointmentTime',) 


class ClinicSerializer(serializers.ModelSerializer): 

    times = TimeSerializer(many=True) 

    class Meta: 
     model = Clinic 
     fields = '__all__' 

    def update(self, instance, validated_data): 

     instance.name = validated_data['name'] 
     instance.streetName = validated_data['streetName'] 
     instance.unitNumber = validated_data['unitNumber'] 
     instance.city = validated_data['city'] 
     instance.province = validated_data['province'] 
     instance.country = validated_data['country'] 
     instance.postalCode = validated_data['postalCode'] 
     instance.phone = validated_data['phone'] 
     #print(instance) 
     instance.save() 

     times_data = [item['id'] for item in validated_data['times']] 
     print(times_data) 
     for time in instance.clinics: 
      if time.id not in times_data: 
       time.delete() 

     for item in validated_data['times']: 
      time = Time(id=item['id'], clinic=instance, 
      appointmentTime=item['appointmentTime']) 
      time.save() 

     return instance 

そして、次のビュー:

class ClinicList(APIView): 

def get(self,request): 
    clinics = Clinic.objects.all() 
    serializer = ClinicSerializer(clinics, many=True) 
    return Response({'results': serializer.data}) 

def post(self, request): 

    serializer = ClinicSerializer(data=request.data) 
    if serializer.is_valid(): 

     serializer.update(Clinic, serializer.data) 

     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

そして、次の既存のデータ:

次のモデルを考える

私のJSON POSTデータされた状態で

{ 
     "id": 2, 
     "times": [ 
      { 
       "appointmentTime": "AAAA" 
      }, 
      { 
       "appointmentTime": "time3" 
      } 
     ], 
     "name": "Example Clinic", 
     "streetNumber": 123, 
     "unitNumber": "", 
     "streetName": "Example Street", 
     "city": "Exampletown", 
     "province": "Ont", 
     "country": "Canada", 
     "postalCode": "A1A1A1", 
     "phone": "9059059059" 
    } 

私の問題は、私はというエラー受け付けておりますということです。

File"C:\Users\colin\Documents\GitHub\Walk_inExpressAPI\clinics\serializer.py",

line 31, in update

instance.save()

TypeError: save() missing 1 required positional argument: 'self'

を私がイムはここに間違っているのかわからないんだけど、あるいはどのような値このエラーを修正するためにinstance.save()に供給します。インスタンスがClinic型のオブジェクトであることを確認しました。

私が達成しようとしているのは、各クリニックが複数のアポイントメントタイムを持つことができることです。私は新しい予定が予約されるたびに予定時刻を削除したいと思っており、各診療所には利用可能な予定時刻が必要です。

あなたが正しい方向に私を導くことを願っていますように!ありがとう!

答えて

0

あなたはユーザー方法あなたのAPIViewPUT必要があります。アップデートでは

urlpatterns = [ 
    url(r'^snippets/$', views.ClinicList.as_view()), 
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.ClinicList.as_view()), 
] 

:そう、あなたにurl.pyは、変更したいオブジェクトを識別するために、PKを

def put(self, request, pk): 
    clinics = Clinic.objects.get(pk=pk) 
    serializer = ClinicSerializer(clinics, data=request.data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

を持つべきですメソッドは次のようにインスタンスの属性を変更します。

instance.name = validated_data.get('name',instance.name) 

DRF pageの例も参照してください。

関連する問題