Django:ModelSerializer字段的初始值

时间:2016-12-21 08:29:23

标签: django django-rest-framework django-serializer

我正在使用django==1.10djangorestframework==3.4.6

编写Django应用

请考虑以下代码:

我有两种模式:

class BaselineModel(models.Model):
    subject = models.ForeignKey('custom_auth.User', blank=True)
    weight = models.SmallIntegerField(null=True, blank=True)

class DosageModel(models.Model):
    subject = models.ForeignKey('custom_auth.User', blank=True)
    udca = models.SmallIntegerField(null=True, blank=True)
    weight = models.SmallIntegerField(null=True, blank=True)

和一个串行器:

class DosageSerializer(serializers.ModelSerializer):

    class Meta:
        exclude = ("subject",)
        model = DosageModel

问题:如何将DosageModel.weight的初始值设置为BaselineModel.weight

使用案例 权重初始值将是在Baseline注册的权重。用户可以选择覆盖初始值。

enter image description here

编辑:初始值应为“initial”,这意味着它应在创建数据对象之前在HTML输入字段中显示。

3 个答案:

答案 0 :(得分:2)

您无法在default序列化程序上使用weight方法,因为此时subject尚未清除。我使用模型级验证来实现结果。

试试这个:

class DosageSerializer(serializers.ModelSerializer):
    weight = serializers.IntegerField(required=False)
    class Meta:
        model = DosageModel
        fields = '__all__'

    def validate(self, data):
        if 'weight' not in data:
            data['weight'] = BaselineModel.objects.get(subject=data['subject']).weight
    return data

我假设用户在创建subject对象时提供DosageModel。如果不是这样,请提供更多详细信息。

答案 1 :(得分:1)

您可以定义一个额外字段(例如my_weight),以便在序列化程序字段中使用initial参数。 以下是示例代码:

class DosageSerializer(serializers.ModelSerializer):

    my_weight = serializers.SmallIntegerField(source="weight", initial=BaselineModel.objects.first().weight)

   class Meta:
        exclude = ("subject",)
        model = DosageModel 

可能是您对用户的初始值,在这种情况下,BaselineModel将根据您所需的subject进行过滤。

答案 2 :(得分:0)

您可以尝试以下

class DosageSerializer(serializers.ModelSerializer):

    weight = models.SmallIntegerField(null=True, blank=True, default=BaselineModel.objects.get(pk=<your pk>)    

    class Meta:
        exclude = ("subject",)
        model = DosageModel

但是你会遇到一个问题:默认值将在服务器启动时被提取一次。

class DosageSerializer(serializers.ModelSerializer):

def __init__(self, *args, **kwargs):
    super(DosageSerializer, self).__init__(*args, **kwargs)
    self.BaselineDefault = BaselineModel.objects.get(pk=<your pk>)

    weight = models.SmallIntegerField(null=True, blank=True, default=BaselineDefault    

    class Meta:
        exclude = ("subject",)
        model = DosageModel

这将在每次初始化Model时获取值。这适用于ModelForms,我不确定RestSerializers的行为是否相同。