2017-03-28 4 views
0

私は練習を休憩枠組みに入れるためにレンタルアプリケーションを開発しています。買い手が家賃の連絡先ボタンをクリックして、買い手がemail_idなどを記入しなければならない機能があります。残りのフレームワークの特定の家賃のための連絡先

rent = Rental.objects.get(id=token) 
contact.objects.create(rent=rent, email_id=email_id, buyer=request.user) 

APIViewのシリアライザとポスト機能の残りのフレームワーク作成機能を混乱させます。誰かが私の例を教えてくれますか?

class Rental(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=300, blank=False, null=False) 
    phone_number = models.PositiveIntegerField(null=False, blank=False) 


class Contact(models.Model): 
    buyer = models.ForeignKey(User) 
    rental = models.ForeignKey(Rental, related_name="rent") 
    email_id = models.EmailField(blank=False, null=False) 

class RentalSerializer(serializers.ModelSerializer): 
    user = serializers.ReadOnlyField(source='user.username') 
    galleries = GallerySerializer(many=True) 
    class Meta: 
     model = Rental 
     fields = ('__all__') 

class ContactSerializer(serializers.ModelSerializer): 
    # buyer = UserSerializer(many=True) 
    # rent = RentalSerializer(many=True) 
    class Meta: 
     model = Contact 
     fields = '__all__' 

class ContactedRent(APIView): 
    serializer_class = ContactSerializer 
    def get(self, request, token=None, format=None): 
     """ 
     Returns a list of contactedRent 
     """ 
     reply = {} 
     try: 
      contacted_rent = Contact.objects.filter(buyer_id=request.user.id) 
      if token: 
       specific_contacted_rent = contacted_rent.get(rental__id=token) 
       reply['data'] = self.serializer_class(specific_contacted_rent).data 
      else: 
       print ('no token') 
       reply['data'] = self.serializer_class(contacted_rent, many=True).data 
     except Contact.DoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 
     except: 
      return error.UnknownError().as_response() 
     else: 
      return Response(reply, status.HTTP_200_OK) 

    def post(self, request, token=None, format=None): 
     """ 
     create a new contact to the rent 
     """ 
     rent = None 
     if not token is None: 
      try: 
       # contact = Contact.objects.get(buyer_id=request.user.id, rental__id=token) 
       rent = Rental.objects.get(id=token) 
      except Rental.DoesNotExist: 
       return RequestedResourceNotFound().as_response() 
      except: 
       return UnknownError.as_response() 
     serialized_data = self.serializer_class(instance=rent, data=request.data, partial=True) 
     if serialized_data.is_valid(): 
      serialized_data.save() 
     else: 
      return error.ValidationError(serialized_data.errors).as_response() 

私の例では、APIViewの作成機能と投稿機能について理解してもらえますか。ここでUPDATE

url(r'^contact/(?P<token>[0-9a-z]+)/$', ContactedRent.as_view(), name="create-contact-to-rent"), 

トークン

あなたはrentalが提出されたデータとして渡されたくないので(EMAIL_ID)

+0

'' ContactedRent' APIView'ためのようなあなたのURLconfは何ですか?そして、あなたはそれにどのデータを渡していますか? – user73657

+0

が更新されました。家賃に連絡するには、家賃が連絡されているかどうかを追跡し、その家賃情報に連絡先情報を送信するために家賃IDが必要です。特定の投稿へのコメントと似ています。 – pythonBeginner

+0

POSTされたデータに 'rent' IDを渡さなくなりましたか?すでにURLに入っているので – user73657

答えて

1

買い手の情報を与えることにより接触されようとしている家賃のIDですシリアライザから削除することができます。あなたが唯一の提出フィールド、フィールドだけ更新を検証する際にシリアライザに

class ContactSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Contact 
     fields = ['buyer', 'email_id'] # omit `rental` field 

partial引数は、PATCH要求のためです。 (私はあなたがrentalを渡さない場合は、あなたのシリアライザは検証されませんので、あなたが回避策としてpartial=Trueを渡していると感じています。)

あなたのシリアライザからrentalを削除したら、あなたが今行うことができるはず。

有効な buyeremail_id値を渡さ与えられ、検証する必要があります
serialized_data = self.serializer_class(data=request.data) 

。その後、あなたはsaveを呼び出すとき、あなたはrentalインスタンスを渡す

serialized_data.save(rental=rent) 
+0

作成機能を使用しませんか?私はまだ作成機能と投稿機能を混同していますか? – pythonBeginner

+0

'ModelSerializer'を使用していたので、' Model.objects.create'をあなたのために行うことができます。 'ModelSerializer.save'メソッドの実装をチェックして、' create'メソッドをどのように使っているかを知りましょう。本当に自分で呼び出したい場合に備えて。 – user73657

+0

レンタルデータを送付した場合とあなたが行ったデータを送付した場合の説明はできますか?もっと尋ねると申し訳ありません。私は他の方法を理解するのが難しいと感じているので、私はあなたに尋ねて学びます。 – pythonBeginner

関連する問題