使用rest框架更新相关对象



给定以下模型:-

class User(models.Model):
first_name = models.CharField()
etc.
class Relation(models.Model):
user = models.ForeignKey(User, related_name='relations', on_delete=models.CASCADE)
is_primary = models.BooleanField(default=False)

我该如何创建一个序列化器和视图来将特定用户的关系设置为主关系呢?

我希望能够发布一些像:-

{ 'relation': 6 }

并为此找到ID为6的关系并将其is_primary设置为True,但我不知道如何做到这一点。

我已经尝试过这样的序列化器:-

class SetRelationSerializer(serializers.ModelSerializer):
relation = serializers.PrimaryKeyRelatedField(queryset=Relation.objects.all())
class Meta:
model = User
fields = ['relation']

和如下的viewset动作:-

@action(['post'], detail=False)
def set_primary_relation(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
// what do I need in here?
return Response(status=status.HTTP_204_NO_CONTENT)

是执行以下操作的唯一方法:-

self.request.user.relations.get(id=serializer.data['relation']).update(is_primary=True)

?因为这对我来说有点不愉快。

肯定有更好的办法吧?

我认为你可以重写序列化器的更新方法。

class SetRelationSerializer(serializers.ModelSerializer):
...
def update(self, instance, validated_data):
relation = validated_data.get("relation")
relation.set_primary = True
relation.save()
return {}

最新更新