我有一个看起来像这样的模型
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?)
答案 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/
这有帮助吗?