使用django-rest-framework将相关对象附加到新创建的对象

时间:2014-05-14 17:59:36

标签: django django-rest-framework

我有一个看起来像这样的模型

class SomeModel(models.Model)
    user = models.ForeignKey(User, null=True)
    some_info = models.CharField(max_length=200)

如果没有附加用户,可能会存在很多这些。但在某些时候,我可能想要将用户附加到其中一些用户身上。 我不知道我应该在哪里做到这一点。我有这个序列化程序,可以很好地创建用户:

class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('username', 'password')
            write_only_fields = ('password',)

    def restore_object(self, attrs, instance=None):
            user = super(UserSerializer, self).restore_object(attrs, instance)
            user.set_password(attrs['password'])
            user.save()
            return user

但是将它连接到已存在的SomeModel的正确位置在哪里?最好具有简单的权限处理。 (APIView?)

1 个答案:

答案 0 :(得分:0)

是的,你可以......我想你的观点是在创建你的“SomeModel”新对象时附上一个用户。你在创建新对象的视图上执行此操作,而不是用户,“someModel”对象,我给你一个简单的例子:

from rest_framework import generics

class SomeModelListCreateAPIView(generics.ListCreateAPIView):
    """
    Api List and Create SomeModel Objects
    """
    model = SomeModel
    serializer_class = SomeModelSerializer

    def pre_save(self, obj):
        obj.user = self.request.user

将其连接到您的URL,每次在API中创建一个新的SomeModel对象时,用户都将是创建它的人...在“pre_save”方法中,您可以应用所需的所有逻辑。

关闭序列化器:

class SomeModelSerializer(serializers.ModelSerializer):
    user = serializers.Field(source='user.username', label="user")

    class Meta:
        model = User
        fields = ('user', 'some_info')

希望这有帮助

修改您的评论

我认为如果您想将SomeModel连接到创建的新用户,有两种方法。

您可以在示例中使用“pre_save”方法创建用户。

您创建用户的ApiView,更新或删除也有“post_save”方法。因此,创建您的用户并在post_method中将您的逻辑连接到您想要的“SomeModel”对象。

class UserListCreateAPIView(generics.ListCreateAPIView):
    """
    Api List and Create User Objects and hook it to SomeModel objects
    """
    model = User
    serializer_class = UserSerializer

    def post_save(self, obj, created=False):
        somemodel_object = SomeModel.object.get(pk=1)
        somemodel_object.user = obj
        somemodel_object.save()

这是一种方式,如果你想在保存用户或post_save之前做一些事情,你可以看到这里或pre_delete或post_delete ...玩游戏。

第二个选择是信号,你在保存用户时发送信号并在SomeModel上捕获它并在那里做一些逻辑,但我发现这更麻烦,但是如你所愿:

https://docs.djangoproject.com/en/dev/topics/signals/

这有帮助吗?