2016-06-29 2 views
2

私はこれらのモデルを持っていると仮定します。は、必要に応じてDjangoのRESTフレームワークに関連する項目を取得

class House(models.Model): 
    name = models.CharField(max_length=50) 
    # Other attributes 

class Booking(models.Model): 
    house = models.ForeignKey(House, on_delete=models.CASCADE) 
    arrival_date = models.DateField() 
    departure_date = models.DateField() 

シリアライザ:

class HouseSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = House 
     fields = ('id','name') 

class BookingSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Booking 
     fields = ('id', 
        'arrival_date', 
        'departure_date', 
        'house') 

あなたが見ることができるように、予約が家に関連付けられています。

ユーザーは「/ house /:houseId」で家に関する情報をリクエストし、「/ booking /:bookingId」で予約できます。

ユーザーが「/ house/booking」をリクエストすると、家に関連するすべての予約を返信したいと思いますが、これは比較的高価な操作であるため「/ house/booking」をリクエストすると返されません。通常は必要ありません。

私はそれらを家に返却する方法を知っていますが、これはオプションにする方法です。それ、どうやったら出来るの?

+1

2つの尿の違いは何ですか? –

答えて

2

/house/bookings/のネームスペースはすでにIDを探しているので、最初に、特定の家の予約のエンドポイントを/house/:houseId/bookings/にすることは、少なくとも意味があります。

ハウスと予約の関係をシリアル化して、ハウスの詳細をエンドポイントに表示することもできます。ような何か:(繰り返しますが、あなたのエンドポイントをと仮定すると/house/<house_id>/bookings/です)

class HouseSerializer(serializers.ModelSerializer): 
    bookings = BookingSerializer(many=True) 

    class Meta: 
     model = House 
     fields = ('id','name', 'bookings',) 

しかし、あなたは別のエンドポイントをしたい場合は、単にBookingSerializerを取り、kwargsからはハウスIDによるクエリセットをフィルタリングするビューを作成

class BookingsForHouseListView(ListAPIView): 
    serializer_class = BookingSerializer 

    def get_queryset(self): 
     return Bookings.objects.filter(house__id=self.kwargs['house_id']) 
+0

ありがとう、私はListAPIView、まだ少しの初心者のDjangoの知らなかった。 – user1582024

+0

提案したHouseSerializerを使用することもできますが、デフォルトでは予約は含まれていませんか? (いくつかのパラメータのように、include_bookings = true) – user1582024

+0

別のシリアライザ(おそらく 'HouseSerializer'の子)を作成し、ビューの' get_serializer_class'をオーバーライドします。また、どのような方法や属性が利用できるかを決定するために、このサイトをチェックしてください:http://www.cdrf.co/ –

0

2つのシリアライザを行うことができます.1つは、本を表示せずに家のリストに、もう1つは、個々の家のために、本を表示します。

ビューでは、リストuriのリストシリアライザと、個々のURIの個別シリアライザを定義します。

0

私は手動でいくつかのことを行うために必要な、私は私に、彼らは私を助けた以上のことを制限されたAPIがあまりにも高レベルの部品をしようとしていた、判明しました。

この回答https://stackoverflow.com/a/17763864/1582024は、リソースの階層を実装する方法を示しています。

関連する問題