2017-03-27 6 views
0

私はdjango-rest-frameworkの初心者です。私はシリアライザと良いapiのデザインを理解しようとしています。 ListView、RetrieveAPIViewなどのビューセットとジェネリックのビューに直接ダイバーしたいとは思っていません。シリアライザとAPIViewをはっきりと理解したいので、以下の基準を使って解決してください。しかし、私は問題の2つだけを下から解決することができました。ここで特定のバイヤーから連絡された家賃のリストを表示

私はここに私のREST APIスキル

""" 
    return a list of rent 
""" 

""" 
    return a list of rent or specific rent if token is give n 
""" 

""" 
    return a list of rent contacted by specific buyer 
""" 

""" 
    return a list of buyer that has contacted a specific rent 
""" 

を磨くために描いた問題のリストは、家賃、ギャラリーや連絡先の私のモデルです。レンタルと連絡先は別のアプリです。連絡先は、その所有者が記載したスペースを購入または賃貸するために賃貸住宅所有者に連絡することです。

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) 
    rate = models.FloatField() 


class Gallery(models.Model): 
    rent = models.ForeignKey(Rental, related_name="galleries") 
    image = models.FileField(upload_to=user_directory_path, null=True, blank=True) 
    tag = models.CharField(max_length=1, choices=TAGS, null=True, blank=True) 


BUYER_CHOICES = (
    ('B', 'Buy'), 
    ('R', 'Rent'), 
) 

class Contact(models.Model): 
    buyer = models.ForeignKey(User) 
    rental = models.ForeignKey(Rental, related_name="rent") 
    email_id = models.EmailField(blank=False, null=False) 
    buyer_choice = models.CharField(choices=BUYER_CHOICES, max_length=1, null=False, blank=False) 


class GallerySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Gallery 
     fields = ('image', 'tag',) 

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

UPDATED RentAPIViewのCODEロングコードを投稿するためのAS PER @Remi

class RentAPIView(APIView): 
    serializer_class = RentalSerializer 
    parser_classes = (FormParser, MultiPartParser,) 
    def get(self, request, token=None, format=None): 
    """ 
    Returns a list of rents (or just rent if token is given) 
    """ 
    reply = {} 
    try: 
     rents = Rental.objects.filter(user=request.user) 
     # code is updated here 
     buyer_id = self.request.query_params.get('buyer_id', None) 
     if buyer_id: 
      rents = rents.filter(user__contact_set__buyer_id=buyer_id) 
     if token: 
      rent = rents.get(id=token) 
      reply['data'] = RentalSerializer(rent).data 
     else: 
      reply['data'] = RentalSerializer(rents, many=True).data 
    except Rental.DoesNotExist: 
     return error.RequestedResourceNotFound().as_response() 
    except: 
     return error.UnknownError().as_response() 
    else: 
     return Response(reply, status.HTTP_200_OK) 

申し訳ありません。私はちょうど効果的な残りのAPIを設計するために最善を尽くしたが、最後の2つの問題を解決することができなかったことを示したかった。

以下の基準をどのように処理するかについて親切にお手伝いできますか?

答えて

0

私は、ビューセットの使用を強く勧めます。あなたのケースでは、ModelViewSetは、get_queryset関数をオーバーライドして、あなたが望む何でもあなたのクエリーセットをプレフィルターするならば、行います。例:

​​

これはDRFのコア機能を使用するほうがはるかにクリーンです。それは、バックあなたの質問に、あなたのAPIのビューを拡張するために上記のロジックの一部を使用することができ、言われている:クエリのparamsと

(あなたがトークンで行ったようにあなたもkwargsからのアプローチで行くことができる):

class RentAPIView(APIView): 
    serializer_class = RentalSerializer 
    parser_classes = (FormParser, MultiPartParser,) 
    def get(self, request, token=None, format=None): 
     """ 
     Returns a list of rents (or just rent if token is given) 
     """ 
     reply = {} 
     try: 
      # first of your two remaining problems 
      # if requesting something like /api/rent?buyer_id=1 
      buyer_id = self.request.query_params.get('buyer_id', None) 

      rents = Rental.objects.filter(user=request.user) 

      if buyer_id: 
       rents = rents.filter(rent__buyer__id=buyer_id) 

      if token: 
       rent = rents.get(id=token) 
       reply['data'] = RentalSerializer(rent).data 
      else: 
       reply['data'] = RentalSerializer(rents, many=True).data 
     except Rental.DoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 
     except: 
      return error.UnknownError().as_response() 
     else: 
      return Response(reply, status.HTTP_200_OK) 

最後の問題は、Rent-ObjectsではなくUserオブジェクトです。これは、異なるAPIビューで行う必要があります。

+0

私は/ api/v1/rentを実行すると "不明なエラー"、 "コード":500?buyer_id = 1 – pythonBeginner

+0

私が行ったことを示すためにコードを更新しました。 – pythonBeginner

+0

申し訳ありませんが、そこにあなたの "関連"の名前が表示されませんでした。クエリを更新しました –

関連する問題