Django Rest Framework:ネストされた構造から値の一意のリストを取得します

世界中

深くネストされたデータ構造から文字列のリストを返せるようにしたい。このシナリオでは、さまざまな地域に多くの場所がある書店のチェーンを管理するAPIがあります。

現在、リージョンのIDを受け取り、リージョン、個々の書店、および各ストアにある本に関する詳細のネストされたJSON構造を返すAPIエンドポイントがあります。

{
  "region": [
    {
      "store": [
        {
          "book": {
            "name": "Foo"
          }
        },
        {
          "book": {
            "name": "Bar"
          }
        },
        {
          "book": {
            "name": "Baz"
          }
        }
      ],
    },
    {
      "store": [
        {
          "book": {
            "name": "Foo"
          }
        },
        {
          "book": {
            "name": "Bar"
          }
        }
      ],
    },
    {
      "store": [
        {
          "book": {
            "name": "Foo"
          }
        },
        {
          "book": {
            "name": "Baz"
          }
        },
        {
          "book": {
            "name": "Qux"
          }
        }
      ]
    }
  ]
}

私のモデルは次のようになります。これらのモデルは、この不自然な例では最も意味がないことを認識していますが、実際のコードを反映しています。

class Book(TimeStampedModel):
    name = models.CharField(default="", max_length=512)


class Bookstore(TimeStampedModel):
    value = models.CharField(default="", max_length=1024)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)


class Region(TimeStampedModel):
    stores = models.ManyToManyField(Bookstore)


class BookstoreChain(TimeStampedModel):
    regions = models.ManyToManyField(Region)

上記の応答用に作成したシリアライザーは次のようになります。

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = "__all__"


class BookstoreSerializer(serializers.ModelSerializer):
    books = BookSerializer()

    class Meta:
        model = Bookstore
        fields = "__all__"


class RegionSerializer(serializers.ModelSerializer):
    stores = BookstoreSerializer(many=True)

    class Meta:
        model = Region
        fields = "__all__"


class BookstoreChainSerializer(serializers.ModelSerializer):
    regions = RegionSerializer(many=True)

    class Meta:
        model = BookstoreChain
        fields = "__all__"

このソリューションのビューまたはシリアライザーがどのように見える必要があるかわかりません。私は、生のSQLを記述したり、ORM / Linqを使用して一連の結果を取得したりすることに慣れています。

上記の応答が有用確実ですが、私が本当にしたいことは所与の領域で見つけることができ書籍名(のユニークなリストを返すためにAPIエンドポイントですFooBarBazQux)。私の応答が次のようになることを願っています:

{
    "books": [
        "Foo",
        "Bar",
        "Baz",
        "Qux"
    ]
}

これまでの私の弱い試みにurls.pyは、次のようなものがありますpath

path("api/regions/<int:pk>/uniqueBooks/", views.UniqueBooksForRegionView.as_view(), name="uniqueBooksForRegion")

私のviews.pyように見えます:

class UniqueBooksForRegionView(generics.RetrieveAPIView):
    queryset = Regions.objects.all()
    serializer_class = ???
サンダーホーン

したがって、店舗を取得する必要がある地域から開始して、店舗内の本をフィルタリングできるようにします。これが機能するソリューションです。

注意:

リクエストにIDがない場合はエラーが発生するため.get()、inの使用避けてください。を使用できますが、Sentryにエラーを記録することはできません。*APIViewget_object_or_404()

から要素を取得するには*APIView、を使用しますfilter()

import logging as L
class UniqueBooksForRegionView(generics.RetrieveAPIView):
    lookup_field = 'pk'
    def get(self, *args, **kwargs)
       regions = Region.objects.filter(pk=self.kwargs[self.lookup_field])
       if regions.exists():
          region = regions.first()
          stores_qs = region.stores.all()
          books_qs = Book.objects.filter(store__in=stores_qs).distinct()
          # use your book serializer
          serializer = BookSerializer(books_qs, many=True)
          return Response(serializer.data, HTTP_200_OK)
       else:
          L.error(f'Region with id {self.kwargs[self.lookup_field]} not found.')
          return Response({'detail':f'Region with id {self.kwargs[self.lookup_field]} not found.'}, HTTP_404_NOT_FOUND)

注意

これがフローです。コードを微調整する必要があるかもしれませんが、フローを理解するのに役立つことを願っています

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Django Rest Framework:ネストされた構造から値の一意のリストを取得します

分類Dev

Django Rest Framework:IDフィールドから一意の難読化されたIDを生成します

分類Dev

Django Rest Frameworkでネストされたシリアライザをどのようにフィルタリングしますか?

分類Dev

Django REST FrameworkのAPIView内から完全なリクエストURLを取得する

分類Dev

GetでIDのリストを返します。Django Rest Framework

分類Dev

Django Rest-Frameworkネストされたシリアライザーの順序

分類Dev

Django Rest Framework-一意のフィールドですが、同じ値を持つ複数のオブジェクトを許可します

分類Dev

ネストされたシリアライザでのdjango-rest-framework 3.0の作成または更新

分類Dev

Django rest Framework-アイテムのリストが必要ですが、タイプ「QuerySet」を取得しました

分類Dev

Django Rest Frameworkのシリアライザーを使用してネストされた関係を持つモデルデータを取得するにはどうすればよいですか?

分類Dev

Django-Rest-Framework。ネストされたオブジェクトの更新

分類Dev

Django Rest Framework 3.0:ネストされた多対1の関係の保存

分類Dev

Django Rest Framework:ネストされた関係のUUIDのリストをシリアライザーに渡す方法は?

分類Dev

Django Rest Framework ImageField

分類Dev

Django-Rest-Frameworkでネストされたデータを取得するときにrelated_nameを変更できますか?

分類Dev

Django Rest Frameworkでテストし、このcurlリクエストを再現しますか?

分類Dev

django Rest Framework 3.1 ModelSerializerで作成/更新を処理します。ネストされたデータを検証するにはどうすればよいですか?

分類Dev

Django-Rest-Frameworkを使用したネストされたシリアライザー

分類Dev

Django-rest-frameworkネストされたURLとdrf-nested-routers

分類Dev

Django Rest Frameworkのネストされたシリアライザーのユニークな検証

分類Dev

Django(REST Framework)は、1回おきに空のリストを返します

分類Dev

Django Rest Frameworkでネストされた関係のハイパーリンクフィールドを構築するにはどうすればよいですか?

分類Dev

django-rest-frameworkで単一ユーザーからの同時リクエストを防止する

分類Dev

Django RESTフレームワーク-複数のネストされたシリアル化は可能ですか?

分類Dev

リクエストの本文で渡された引数を使用してフィルタリングするようにviewsets.ModelViewSetを構成するにはどうすればよいですか。(Django Rest Framework)

分類Dev

Django Rest Frameworkのシリアル化されたオブジェクトの構造を変更します(モデルコンテンツの外部のプルIDフィールド)

分類Dev

Django Rest Framework:IDのリストをシリアル化する

分類Dev

ネストされた関係シリアライザのDjango Rest FrameworkモデルIDフィールド

分類Dev

django-rest-frameworkの書き込み可能なネストされたシリアライザー?

Related 関連記事

  1. 1

    Django Rest Framework:ネストされた構造から値の一意のリストを取得します

  2. 2

    Django Rest Framework:IDフィールドから一意の難読化されたIDを生成します

  3. 3

    Django Rest Frameworkでネストされたシリアライザをどのようにフィルタリングしますか?

  4. 4

    Django REST FrameworkのAPIView内から完全なリクエストURLを取得する

  5. 5

    GetでIDのリストを返します。Django Rest Framework

  6. 6

    Django Rest-Frameworkネストされたシリアライザーの順序

  7. 7

    Django Rest Framework-一意のフィールドですが、同じ値を持つ複数のオブジェクトを許可します

  8. 8

    ネストされたシリアライザでのdjango-rest-framework 3.0の作成または更新

  9. 9

    Django rest Framework-アイテムのリストが必要ですが、タイプ「QuerySet」を取得しました

  10. 10

    Django Rest Frameworkのシリアライザーを使用してネストされた関係を持つモデルデータを取得するにはどうすればよいですか?

  11. 11

    Django-Rest-Framework。ネストされたオブジェクトの更新

  12. 12

    Django Rest Framework 3.0:ネストされた多対1の関係の保存

  13. 13

    Django Rest Framework:ネストされた関係のUUIDのリストをシリアライザーに渡す方法は?

  14. 14

    Django Rest Framework ImageField

  15. 15

    Django-Rest-Frameworkでネストされたデータを取得するときにrelated_nameを変更できますか?

  16. 16

    Django Rest Frameworkでテストし、このcurlリクエストを再現しますか?

  17. 17

    django Rest Framework 3.1 ModelSerializerで作成/更新を処理します。ネストされたデータを検証するにはどうすればよいですか?

  18. 18

    Django-Rest-Frameworkを使用したネストされたシリアライザー

  19. 19

    Django-rest-frameworkネストされたURLとdrf-nested-routers

  20. 20

    Django Rest Frameworkのネストされたシリアライザーのユニークな検証

  21. 21

    Django(REST Framework)は、1回おきに空のリストを返します

  22. 22

    Django Rest Frameworkでネストされた関係のハイパーリンクフィールドを構築するにはどうすればよいですか?

  23. 23

    django-rest-frameworkで単一ユーザーからの同時リクエストを防止する

  24. 24

    Django RESTフレームワーク-複数のネストされたシリアル化は可能ですか?

  25. 25

    リクエストの本文で渡された引数を使用してフィルタリングするようにviewsets.ModelViewSetを構成するにはどうすればよいですか。(Django Rest Framework)

  26. 26

    Django Rest Frameworkのシリアル化されたオブジェクトの構造を変更します(モデルコンテンツの外部のプルIDフィールド)

  27. 27

    Django Rest Framework:IDのリストをシリアル化する

  28. 28

    ネストされた関係シリアライザのDjango Rest FrameworkモデルIDフィールド

  29. 29

    django-rest-frameworkの書き込み可能なネストされたシリアライザー?

ホットタグ

アーカイブ