2017-03-28 1 views
0

연습용 프레임 워크를 대여하려면 대여 응용 프로그램을 개발 중입니다. 구매자가 집주인에게 연락 할 수있는 곳이 있습니다. 임대인의 연락처 버튼을 클릭하여 이메일 주소 등을 기입해야합니다. 특정 임대료에 연락하고 싶다면 다음과 같이해야합니다.나머지 프레임 워크의 특정 임대료에 대한 문의처

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

API 프레임 워크의 직렬 함수 및 게시 기능의 나머지 프레임 워크 작성 기능을 혼란스럽게합니다. 내 모범을 보여 주면 누구든지 나를 깨우칠 수 있습니까?

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

업데이트 된 내 URL. 집세에 연락하려면 집세가 연락되어 있는지 추적하고 그 집주인에게 연락처 정보를 보내려면 집세가 필요합니다. 특정 게시물에 대한 댓글과 유사합니다. – pythonBeginner

+0

POST 된 데이터에 더 이상 대여 ID를 전달하지 않습니까? 이미 URL에 있으니? – user73657

답변

1

구매자 정보를 제공하여 연락 할 것입니다 임대료의 ID입니다 , serializer에서 제거 할 수 있습니다. 만 제출 필드, 갱신 필드 만의 유효성을 검사 할 때

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

시리얼 라이저에 partial 인수는 PATCH 요청입니다. (난 당신이 rental를 통과하지 못한 경우 시리얼 유효성을 검사하지 않기 때문에 당신이 해결 방법으로 partial=True을 전달하는 느낌.)

당신이 당신의 시리얼에서 rental을 제거하면, 당신이 지금 할 수 있어야한다 : 당신을 주어 확인해야

serialized_data = self.serializer_class(data=request.data) 

유효한 buyeremail_id 값을 통과시켰다. 당신이 save를 호출 할 때 다음, 당신은 rental 예를

serialized_data.save(rental=rent) 
+0

작성 기능을 사용하지 않습니까? 나는 여전히 작성 및 게시 기능과 혼동하고 있습니까? – pythonBeginner

+0

'ModelSerializer'를 사용 했으므로'Model.objects.create'를 대신 할 수 있습니다. 'ModelSerializer.save' 메쏘드의 구현을 점검하여'create' 메쏘드를 사용하는 법을 배우십시오. 실제로 전화를 직접하고 싶을 때를 대비 해서요. – user73657

+0

임대 데이터를 전송 한 사례와 이전에 수행 한 사례를 설명해 주시겠습니까? 더 묻는 것에 대해 유감스럽게 생각합니다. 나는 다른 길을 이해하기가 어려워서 묻는다면 당신에게서 배우고 있습니다. – pythonBeginner

관련 문제