2016-12-21 7 views
2

私はdjango==1.10djangorestframework==3.4.6ジャンゴ:ModelSerializerフィールドの初期値

を使って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) 

と、A:

を私は2つのモデルを持っていますシリアライザ:

class DosageSerializer(serializers.ModelSerializer): 

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

質問:DosageModel.weightの初期値をBaselineModel.weightに設定するにはどうすればよいですか?

使用例: 重み初期値はベースラインに登録された重みになります。ユーザーは、初期値を上書きするかどうかを選択できます。

enter image description here

編集:初期値は、データオブジェクトが作成される前に、それは私のHTML入力フィールドに表示されなければならないという意味、「初期」でなければなりません。

+0

あなたはすでにhttp://www.django-rest-framework.org/api-guide/fields/#defaultオプションを使用しようとしましたか? –

+0

私はModelSerializerを使ってSerializerFieldsを使用していません。 SerializerFieldsを使用して解決策が可能な場合は、コード例を提供してください: – Vingtoft

答えて

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 

これは、モデルが初期化されるたびに値を取得します。これはModelFormsで動作し、RestSerializersが同じように動作するかどうかはわかりません。

2

subjectはその時点ではクリーニングされていないため、defaultメソッドをweightシリアライザで使用することはできませんでした。結果を達成するためにモデルレベルの検証を使用しました。私はDosageModelオブジェクトを作成するときに、ユーザーが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 

はこれを試してみてください。そうでない場合は、詳細をご記入ください。

+0

検証時に検証が呼び出されます(クライアントが結果をPOSTするとき)。 POST要求がサーバーまで送信される前に、フィールドに初期値を事前に設定する必要があります。 – Vingtoft

+0

インスタンスの作成または更新時に検証が呼び出されます。または、 'weight == None'で' Dosage'を取得するとき、その値で重みフィールドを埋めなければならないということですか? –

+0

はい、作成または更新する前にウェイトフィールドに初期値を入力する方法を探しています。もっと正確に質問を更新します、謝罪します! – Vingtoft

1

シリアライザフィールドにinitial引数を使用するための追加フィールド(my_weightなど)を定義できます。ここで はサンプルコードです:

class DosageSerializer(serializers.ModelSerializer): 

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

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

BaselineModelご希望subjectに基づいてフィルタリングされる場合には、ユーザーにあなたの初期値の扶養家族であってもよいです。