【发布时间】:2020-07-06 20:29:24
【问题描述】:
我希望能够从深度嵌套的数据结构中返回字符串列表。在这个场景中,我有一个 API 来管理连锁书店,这些书店在不同地区有很多地方。
目前,我有一个 API 端点,它接受一个地区的 ID,并返回一个嵌套的 JSON 结构,其中包含有关该地区、各个书店以及可以在每个商店中找到的书籍的详细信息。
{
"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 端点来返回可以在给定区域中找到的唯一书名列表(Foo、Bar、Baz、@987654327 @)。我希望我的回复看起来像:
{
"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 = ???
【问题讨论】:
-
你能发布一个你想要得到的输出的例子吗?添加您的模型也可能会有所帮助。
-
@NavidZarepak,我在上面编辑了我的问题以包含请求信息。希望这足以让我了解我不理解的内容来解决我的问题。
-
您希望该响应作为
BookstoreSerializer响应的一部分,对名为books的字段进行响应吗? -
我并不特别关注响应的外观,我只需要一个易于迭代结构的书名列表。
标签: django django-rest-framework