gpt4 book ai didi

Django REST框架perform_create : You cannot call `.save()` after accessing `serializer.data`

转载 作者:行者123 更新时间:2023-12-03 15:58:53 28 4
gpt4 key购买 nike

我目前有以下 View 集:

class ArtistProfileViewSet(viewsets.ModelViewSet):
queryset = ArtistProfile.objects.all()
serializer_class = ArtistProfileSerializer

def perform_create(self, serializer):
if serializer.is_valid():
serializer.save()

使用以下序列化器:
class SimpleArtistTrackSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = ArtistTrack
fields = (...my fields...)


class ArtistProfileSerializer(serializers.HyperlinkedModelSerializer):
owners = UserSerializer(many=True, required=False)
tracks = SimpleArtistTrackSerializer(many=True, required=False)

class Meta:
model = ArtistProfile
fields = (...my fields...)

我收到以下错误:
AssertionError: You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead. 

我看不到要在哪里编辑serializer.data对象。我缺少某些会导致此编辑的内容吗?如何解决此错误?

最佳答案

您根本不需要在那里调用is_valid。进行更新时,序列化器会使用模型实例进行初始化(基于路由中的pk,例如PATCH /artists/{3}/)。如果要将数据传递给序列化程序,则可以调用is_valid(),如下所示:

ser = MySerializer(data=request.data) # validate incoming post, etc
ser.is_valid(raise_exceptions=True)
data = ser.validated_data

要在保存时向序列化程序发送其他数据(例如,设置公司或设置用户等),请使用如下替代:
def perform_create(self, serializer):
serializer.save(company=self.request.user.company)

有关更多详细信息,我将浏览DRF源代码并查看其功能。它写得很好而且清晰。

您的评论指出了另一个更大的问题。您说要在艺术家和用户之间的“join”表中添加其他数据。可以完成此操作,但这是一个完全不同的主题,您最终需要手动管理该关系。另外,阅读嵌套可写序列化程序,这是一个很大的话题,甚至需要更多的体力劳动。

关于Django REST框架perform_create : You cannot call `.save()` after accessing `serializer.data` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783122/

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