我正在使用django==1.10
和djangorestframework==3.4.6
请考虑以下代码:
我有两种模式:
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注册的权重。用户可以选择覆盖初始值。
编辑:初始值应为“initial”,这意味着它应在创建数据对象之前在HTML输入字段中显示。
答案 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的行为是否相同。