使用source属性更新相关的Emailfield

时间:2014-07-07 13:22:02

标签: django django-rest-framework

我有一个使用OnetoOneField到用户模型的药房模型:

class Pharmacy(models.Model):
    user = models.OneToOneField(User)
    name = models.CharField(max_length=100)
    fdo_code = models.CharField(max_length=100, null=True, blank=True)
    dr_name = models.CharField(max_length=100)

我为检索和更新Pharmacy模型定义了以下序列化程序和ViewSet:

class PharmacySerializer(serializers.ModelSerializer):
    email = serializers.EmailField(source='user.email')
    class Meta:
        model = Pharmacy
        fields = ('id', 'email', 'name', 'dr_name')

class PharmacyViewSet(mixins.UpdateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    model = Pharmacy
    serializer_class = PharmacySerializer
    permission_classes = (permissions.IsAuthenticated,)

使用正确的电子邮件地址回答GET查询,但PUT查询不会更新电子邮件地址(将执行其他字段)。

我读过Tom Christie评论的this question

  

嵌套序列化程序表示当前是只读的

但我认为我的序列化不被视为嵌套,如果是,您是否知道使用单个更新请求更新电子邮件和其他信息的工作解决方案?

1 个答案:

答案 0 :(得分:1)

不幸的是,您的序列化是嵌套的,即使在您的药房模型中,您只有一个来自其他模型的字段。

到目前为止,我提出的最佳解决方案是覆盖 pre_save 方法并保存电子邮件地址。 (此方法可从UpdateMixin获得)。这是一个简短的例子:

def pre_save(self, obj):
    """
    obj is your object to be saved
    """
    user = obj.user
    user.email = self.request.DATA['email']
    user.save()

当然,您也可以覆盖 put 方法,以最适合您的方式。 祝你好运!