gpt4 book ai didi

python - Django Rest框架绕过嵌套关系中的实体

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:40 24 4
gpt4 key购买 nike

考虑这三种模型:

class Genre(models.Model):
slug = models.CharField(max_length=30, unique=True)
name = models.CharField(max_length=300)

class Group(models.Model):
slug = models.CharField(max_length=30, unique=True)
name = models.CharField(max_length=300)
genre = models.ForeignKey('Genre', related_name='groups')

class Album(models.Model):
name = models.CharField(max_length=300)
track_count = models.IntegerField()
artist = models.ForeignKey('Group', related_name='albums')

现在,我需要这种 DRF 输出:

[ 
{'name': 'Rock', 'albums': [
{'name': 'Meteora', 'track_count': 12},
{'name': 'Master of Puppets', 'track_count': 10'}]
},
{..},
]

换句话说,我需要绕过“团体”模型来获取每种流派的所有专辑。我已经通过这种方式取得了类似的成就:

views.py

class SegmentViewSet(viewsets.ModelViewSet):

queryset = Genre.objects.all().annotate(Count('name'))
serializer_class = GenreSerializer

序列化器.py

class GroupSerializer(serializers.ModelSerializer):
albums = AlbumSerializer(many=True, read_only=True)

def to_representation(self, value):
return value.products.annotate(Count('id')).values('name', 'sap_code')

class Meta:
model = Group
fields = ('albums',)


class GenreSerializer(serializers.ModelSerializer):
albums = GroupSerializer(many=True, read_only=True)

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

这给了我这样的东西:

[
{'name': 'Rock', 'albums': [
[
{'name': 'Meteora', 'track_count': 12},
{...},
{...}
],
[
{...},
{...}
]
]
}
]

这是专辑,按专辑分组,按流派分组。这是一个嵌套数组,我只需要在一个数组中按流派分组的专辑。

我知道我的 to_representation 函数解决方案非常脏,但它与我正在寻找的东西类似。但是,嘿,这就是自定义相关字段的用途。

有没有一种方法可以在不直接将专辑与流派链接的情况下获得所需的输出?确实有理由让事情保持这种状态。

我已经尝试过自定义相关字段 PrimaryKeyRelatedField,甚至尝试在我看来重载 get_queryset。我是不是忽略了什么?

最佳答案

您可以尝试按如下方式定义序列化器:

from rest_framework import serializers


class GenreSerializer(serializers.ModelSerializer):
albums = serializers.SerializerMethodField()

class Meta:
model = Genre

def get_albums(self, obj):
albums = Album.objects.filter(group__genre=obj)
albums_serializer = AlbumSerializer(data=albums, many=True)
albums_serializer.is_valid()
return albums_serializer.data


class AlbumSerializer(serializers.ModelSerializer):
class Meta:
model = Album

结果应如下所示:

[{
'name': 'Rock',
'albums': [{
'name': 'Meteora',
'track_count': 13
},
{
'name': 'Master of Puppets',
'track_count': 12
},
{
'name': 'Nevermind',
'track_count': 11
}
]
},
{
'name': 'Pop',
'albums': [{
'name': 'Ray of Light',
'track_count': 11
},
{
'name': 'Thriller',
'track_count': 14
}
]
}
]

请注意,这是高度未优化和未经测试的,但从这里我确信您知道如何在 View 中使用 GenreSeralizer 并优化代码。

关于python - Django Rest框架绕过嵌套关系中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862376/

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