我有以下序列化器
class MyModelSerializer(serializers.ModelSerializer):
user = UserSerializer()
def create(self, validated_data):
print("TEST")
MyModel, created = MyModel.objects.get_or_create(**validated_data)
return MyModel
class Meta:
model = MyModel
fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)
和以下视图集:
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
当我向与指定视图集相对应的端点发出POST
请求时,create()
方法绝对不执行任何操作。如您所见,我尝试在控制台TEST
中进行打印,但是什么也没有。
有人对这种奇怪的行为有想法吗?
谢谢你!
编辑: API调用:
return axios({
method: 'post',
url: 'http://localhost:8000/api/mymodel/',
data: {
title: this.title,
movie: this.id,
text: this.text,
user: this.user
}
答案 0 :(得分:3)
如果您在ViewSet中查看POST处理的实现,则可以找到:
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
串行器验证数据后,将调用您的create
方法。
您看到的错误(用户已经存在)是由于从上面的代码片段调用serializer.is_valid
导致的。
因此,永远无法致电您的create
。上方的这段代码会将您的脚架称为self.perform_create()
的一部分。
因此,这意味着您正在尝试创建一个已经存在的用户。因此,在您的模型中,您具有唯一的用户名。
答案 1 :(得分:0)
这可能是因为您已进行某种错误处理,因为编写def create函数的方式将引发错误。我测试了以下代码,对我来说很有效:
class MyModelSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = MyModel
fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)
def create(self, validated_data):
print("TEST")
data = validated_data
data, created = MyModel.objects.get_or_create(**data)
return data
希望这会有所帮助!
答案 2 :(得分:0)
好的。我找到了替代方案。由于只需要用户对象中的用户名,因此我删除了user = UserSerializer()
并添加了user_username = serializers.ReadOnlyField(source='user.username')
:
class ReviewSerializer(serializers.ModelSerializer):
user_username = serializers.ReadOnlyField(source='user.username')
class Meta:
model = Review
fields = ('pk', 'title', 'user', 'user_username', 'movie', 'timestamp', 'review_text',)
user = UserSerializer()
让我头疼,所以我解决了它。我将检查Entushiast Martin的答案作为一种解决方案,因为它们将我带到了实际答案。谢谢。
已解决。