10

Django フレームワークと Django REST フレームワークは初めてですが、基本的なセットアップと実装は実行できました。http://mydomain.com/location/1 (1 は主キー) など、単一のオブジェクトのドメインを呼び出すと、魔法のように機能します。これにより、次のような JSON 応答が得られます。

{"id": 1, "location": "Berlin", "country": 2}

.. およびhttp://mydomain.com/country/2応答は次のようになります。

{"id": 2, "country": "Germany"}

必要なもの:ドメインhttp://mydomain.com/all_locations/ を呼び出すときなど、複数の場所を取得する必要があります。次のような応答が期待されます。

[
  {"id": 1, "location": "Berlin", "country": 2},
  {"id": 2, "location": "New York", "country": 4},
  {"id": 3, "location": "Barcelona", "country": 5},
  {"id": 4, "location": "Moscow", "country": 7}
]

これはオプションです: 2 番目のステップでは、 http://mydomain.com/mix_all_locations_countries/を呼び出すときに、1 つの応答で複数の国と場所を取得したいと考えています。たとえば、次のようになります。

[
  {"locations":
    {"id": 1, "location": "Berlin", "country": 2},
    {"id": 2, "location": "New York", "country": 4},
    {"id": 3, "location": "Barcelona", "country": 5},
    {"id": 4, "location": "Moscow", "country": 7}
  },
  {"countries":
    {"id": 1, "country": "Brazil"}
    {"id": 2, "country": "Germany"},
    {"id": 3, "country": "Portugual"}
    {"id": 4, "country": "USA"},
    {"id": 5, "country": "Spain"},
    {"id": 6, "country": "Italy"}
    {"id": 7, "country": "Russia"}
  }
]

これまでの私の実装は次のとおりです(場所の実装を示しているだけです):

models.pyで:

class Location(models.Model):
    # variable id and pk are always available
    location = models.CharField(max_length=100)
    country = models.ForeignKey("Country")

serializers.pyで:

class LocationsSerializer(serializers.ModelSerializer):
    country_id = serializers.Field(source='country.id')

    class Meta:
        model = Location
        fields = (
            'id',
            'location',
            'country_id',
        )

views.pyで:

class LocationAPIView(generics.RetrieveAPIView):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer

urls.pyで:

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

私が試したこと:上記のドメインを呼び出すときに単一のオブジェクトに対して機能するため、モデルとシリアライザーを変更する必要はないと思います。そこで、 を実装して に新しい URL を追加しようとしLocationsViewSetましviews.pyurls.pyが、失敗しました。どのように実装できるか考えていますか? おそらく、LocationAPIView でメソッドを定義し、次のような URL を変更して定義します。

url(r'^all_locations/$', views.LocationAPIView.get_all_locations(), name='LocationAPIView')

事前に感謝します。助けていただければ幸いです。

敬具、マイケル

4

1 に答える 1

15

最初に、ビューセットのことはしばらく忘れましょう。ビューセットはいくつかのことをよりシンプルにしますが、今は気にする必要のない追加の抽象化レイヤーも導入します。

必要として最初に言及するのは、現在の詳細エンドポイントに相当するリスト エンドポイントです。ほとんどの場合、既存のビューと一緒に追加のビューを導入する必要があります。

views.py:

class LocationListAPIView(generics.ListAPIView):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer

class LocationDetailAPIView(generics.RetrieveAPIView):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer

URLconf で両方のビューを関連付けます。

urls.py:

url(r'^location/$', views.LocationListAPIView.as_view(), name='location-list'),
url(r'^location/(?P<pk>[0-9]+)/$', views.LocationDetailAPIView.as_view(), name='location-detail')

また、URL 名のスタイルを変更して、通常の Django 規則でより標準的なものにしたことに注意してください。

次に、場所と国のビューを組み合わせたものが必要でした。かなりカスタムの動作であるため、既存の汎用ビューを使用することはできませんが、ビューを作成するのは簡単です...

views.py:

class CombinedAPIView(APIView):
    def get(self, request):
        locations = Location.objects.all()
        countries = Country.objects.all()

        location_serializer = LocationSerializer(locations, many=True)
        country_serializer = CountrySerializer(countries, many=True)

        return Response({
            'countries': country_serializer.data,
            'locations': location_serializer.data
        })

ビューを配線します。

urls.py:

url(r'^combined/$', views.CombinedAPIView.as_view(), name='combined-list')

応答を生成するときにシリアライザーをまったく使用する必要がないことに注意してください。各インスタンスで必要なすべてのフィールドを引き出して、ビュー自体で明示的に応答のデータを構築することもできますが、これは標準的な方法です。モデル インスタンスをデータの辞書にマップします。

うまくいけば、それで十分に始めることができます。:)

于 2013-08-29T11:25:54.103 に答える