Django Rest Framework:如何在保存时从相关对象复制字段?

时间:2015-01-09 15:55:46

标签: django rest django-rest-framework

我正在制作一个REST API来跟踪Pathfinder角色扮演游戏中的角色,而我在围绕如何将Race中的属性应用于角色方面遇到了一些麻烦。

在我的应用中,Character包含他们可以拥有的所有属性的字段。一些将通过他们的Race通知,其他人通过他们的Class等通知。为简单起见,我将只关注speed属性,因为此复制行为将在许多地方使用。所以重申:

所有Character个对象都有speedrace字段。每个Race也有一个speed属性,并且Races已预先填充。当用户创建Character时,他们会为其角色选择RaceCharacter的速度将以Race的速度通知。我希望在保存Character模型时发生这种情况 - 也就是说,在用户提交请求和发送响应200 OK之间的某个时间,将从选定的{复制speed属性的值{1}} Race对象的对象。

注意,我不只是关联Character的{​​{1}}字段,因为它可以被许多不同的东西改变,所以我只是在应用修饰符时更新值。

我现在主要只是朝着正确的方向寻找一个点,但任何其他信息都会有所帮助。

编辑: models.py:

Character

serializers.py:

speed

2 个答案:

答案 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