gpt4 book ai didi

django rest framework 多个外键序列化

转载 作者:行者123 更新时间:2023-12-04 03:19:43 26 4
gpt4 key购买 nike

起初看起来很简单,现在我很困惑。我写了数据结构,现在正在努力获得它。到目前为止我所拥有的:

class Area(models.Model):
name = models.CharField(max_length=128)
...

class Category(models.Model):
name = models.CharField(max_length=128)
....

class Venue(models.Model):
name = models.CharField(max_length=128)
category = models.ForeignKey(Category, related_name='venues')
area = models.ForeignKey(Area, related_name='venues')

我需要根据 Area pk 获取其中包含 field 的类别。是否可以使用 django rest 框架这样做?结果应该类似于:

  {
"pk": 1,
"name": "London",
"categories": [
{
"pk": 1,
"name": "Bars",
"venues": [
{
"pk": 1,
"name": "Cool bar"
},
{
"pk": 2,
"name": "Cooler bar"
},
{
"pk": 3,
"name": "Coldest bar"
},
]
}
]

}

理想情况下我需要这样的东西:

class VenueSerializer(serializers.ModelSerializer):
.....

class CategorySerializer(serializers.ModelSerializer):
venues = VenueSerializer(read_only=True, many=True)

class Meta:
model = Category
fields = ('pk', 'name', 'venues', )

class AreaSerializer(serializers.ModelSerializer):
categories = CategorySerializer(read_only=True, many=True)

class Meta:
model = Area
fields = ('pk', 'name', 'categories', )

当然这不会起作用,因为 AreaCategory 没有直接相关。所以我的问题是,是否可以在不更改数据结构的情况下执行此操作?

最佳答案

它有点难看,但如果你设置在对象模型上,你可以使用 DRF's SerializerMethodField 来做到这一点.

你的 Area 序列化器看起来像这样:

class AreaSerializer(serializers.ModelSerializer):
categories = SerializerMethodField()

def get_categories(self, obj):
# this will find all categories with a venue in given area
categories = Category.objects.filter(venues__area=obj)
serializer = CategorySerializer(categories, many=True)
return serializer.data

class Meta:
model = Area
fields = ('pk', 'name', 'categories', )

如果不进行优化,这个结构将产生大量的数据库查询。我建议使用 Django's prefetch_related减少冗余查询数量的操作。

关于django rest framework 多个外键序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com