我正在制作一个REST API来跟踪Pathfinder角色扮演游戏中的角色,而我在围绕如何将Race中的属性应用于角色方面遇到了一些麻烦。
在我的应用中,Character
包含他们可以拥有的所有属性的字段。一些将通过他们的Race
通知,其他人通过他们的Class
等通知。为简单起见,我将只关注speed
属性,因为此复制行为将在许多地方使用。所以重申:
所有Character
个对象都有speed
和race
字段。每个Race
也有一个speed
属性,并且Races已预先填充。当用户创建Character
时,他们会为其角色选择Race
,Character
的速度将以Race
的速度通知。我希望在保存Character
模型时发生这种情况 - 也就是说,在用户提交请求和发送响应200 OK之间的某个时间,将从选定的{复制speed属性的值{1}} Race
对象的对象。
注意,我不只是关联Character
的{{1}}字段,因为它可以被许多不同的东西改变,所以我只是在应用修饰符时更新值。
我现在主要只是朝着正确的方向寻找一个点,但任何其他信息都会有所帮助。
编辑: models.py:
Character
serializers.py:
speed
答案 0 :(得分:1)
假设你的模特有几件事......
my_character.speed = my_charater.race.speed
my_character.save()
如果你想在首次保存角色时发生这种情况......
# models.py
class Character(models.Model):
[...]
def save(self, *args, **kw):
if self.id is None:
# set default speed value
self.speed = self.race.speed
# either way, run the rest of your model's inherited save() behavior
super(Character, self).save(*args, **kw)
答案 1 :(得分:1)
当您第一次创建对象时,您很可能希望在序列化程序级别执行此操作。 Django REST框架提供了post_save
挂钩,您可以覆盖它以实现此目的。
class CharacterSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.Field(source='owner.username')
class Meta:
model = models.Character
fields = ('url', 'speed', 'owner')
def post_save(self, obj, created=True):
obj.speed = obj.race.speed
在Django REST框架3中,此钩子已重命名为perform_create
。