2017-11-14 28 views
0

djangoにはselect_relatedとprefetch_relatedがあり、データベースから項目をクエリしてパフォーマンスを向上させるときに使用でき、django restフレームのネストされたシリアライザとペアで使用できます。django rest framework:シリアライザで初期データをプリフェッチ

私は例えば、私のモデル を作成するために、シリアライザを使用する場合ただし、問題が来る:

要求:たとえば

class CompanySerializer(serializer.serializers): 
    employee_set = serializers.JSONField() 
    class Meta: 
     model = Company 
     fields = ('id', 'employee_set') 
    def create(self, validated_data): 
     employee_set = validated_data.pop('employee_set') 
     for employee in employee_set: 
      serializer = EmployeeSerializer(data=employee) 
      serializer.is_valid(raise_exception=True) 
      serializer.save() 

class EmployeeSerializer(serializer.serializers): 
    card = serializers.PrimaryKeyRelatedField(queryset=Card.objects.all()) 
    class Meta: 
     model = Employee 
     fields = ('id', 'name', 'card') 
    def validate(self, obj): 
     if card.employee_set.all().count() > 3: 
      raise serializers.ValidationError({'_error': 'invalid}) 
     return data 

を、私は次のように複数の従業員を持つ企業を作成したいです.POST:

{ 
    employee_set: [ 
     { name: 'tim', card: 1 }, 
     { name: 'bob', card: 1 }, 
     { name: 'jimmy', card: 2}, 
    ] 
} 

次に、CompanySerializer(request.POST)を使用できますか?

ただし、このシリアライザを保存すると、EmployeeSerializerは各従業員を繰り返し処理し、employee.card_setを照会するため、多くのSQL問合せが発生します。 prefetch_relatedのようなやり方はありますか?

おかげ

答えて

0

質問があまりにも開いているように、私は指示を与えるでしょう。

Django ORMでは、bulk_createを使用して複数のインスタンスを一度に作成することができます。

はまた、あなたがthe documentation

0

に示すように、あなたはcontext

# use select_related or prefetech_related to get this value 
card_counters = {'card_id1': 1, 'card_id2': 3, ...} 

for employee in employee_set: 
    serializer = EmployeeSerializer(
     data=employee, 
     context={'card_counter': card_counters.get(employee['card_id'], 0)} 
    ) 
    ... 

を経由して、あなたのシリアライザに追加情報を送信し、それを使用することができ、作成/更新シリアライザのから別のシリアライザを呼び出してはならないことに注意してください検証を行うとき:

def validate(self, obj): 
    if self.context['card_counter'] > 3: 
     raise serializers.ValidationError({'_error': 'invalid}) 
    return data 
関連する問題