【问题标题】:Django: Initial value for a ModelSerializer fieldDjango:ModelSerializer 字段的初始值
【发布时间】:2017-05-06 14:41:01
【问题描述】:

我正在使用 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

用例: 权重初始值将是在基线注册的权重。用户可以选择覆盖初始值。

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

【问题讨论】:

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


【解决方案1】:

你可以试试下面的

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

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

【讨论】:

    【解决方案2】:

    您不能在weight 序列化程序上使用default 方法,因为当时还没有清理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
    

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

    【讨论】:

    • 验证是在验证时调用的(当客户端发布结果时),对吧?在将 POST 请求发送到服务器之前,我需要使用初始值预先填充该字段。
    • 验证将在创建或更新实例时被调用。或者您的意思是当使用weight == None 获取Dosage 时应该用该值填充权重字段?
    • 是的,我正在寻找一种在创建或更新之前用初始值填充权重字段的方法。抱歉,我会更准确地更新问题!
    【解决方案3】:

    您可以定义一个额外的字段(例如 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 进行过滤。

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2015-12-29
      • 2018-03-22
      • 2020-02-13
      • 2013-10-22
      • 2021-05-18
      • 2010-12-27
      • 2012-07-03
      相关资源
      最近更新 更多