diff --git a/main/serializers.py b/main/serializers.py index 3bf418f..8488b65 100644 --- a/main/serializers.py +++ b/main/serializers.py @@ -2,22 +2,24 @@ from main.models import MainTable, RelatedField1, RelatedField2, RelatedField3 -class MainTableRelatedFields(serializers.RelatedField): - def display_value(self, instance): - return instance - - def to_representation(self, value): - return str(value) - - def to_internal_value(self, data): - return self.queryset.model.objects.get(name=data) - - class MainTableSerializerList(serializers.ListSerializer): def create(self, validated_data): - records = [MainTable(**item) for item in validated_data] - return self.child.Meta.model.objects.bulk_create(records) + r3_cache = {r3['name']: r3['id'] for r3 in list(RelatedField3.objects.all().values('name', 'id'))} + r2_cache = {r2['name']: r2['id'] for r2 in list(RelatedField2.objects.all().values('name', 'id'))} + r1_cache = {r1['name']: r1['id'] for r1 in list(RelatedField1.objects.all().values('name', 'id'))} + + data_objects = [] + for data in validated_data: + data['relfield3_id'] = r3_cache.get(data['relfield3']) + data['relfield2_id'] = r2_cache.get(data['relfield2']) + data['relfield1_id'] = r1_cache.get(data['relfield1']) + del data['relfield1'], data['relfield2'], data['relfield3'] + data_objects.append(MainTable(**data)) + bulk_created_list = MainTable.objects.bulk_create(data_objects) + + return MainTable.objects.filter(id__in=[record.id for record in bulk_created_list]).prefetch_related( + 'owner', 'relfield1', 'relfield2', 'relfield3') class MainTableSerializer(serializers.ModelSerializer): @@ -28,9 +30,9 @@ class Meta: id = serializers.IntegerField(write_only=False, required=False) owner = serializers.ReadOnlyField(source='owner.username') - relfield3 = MainTableRelatedFields(queryset=RelatedField3.objects.all()) - relfield2 = MainTableRelatedFields(queryset=RelatedField2.objects.all()) - relfield1 = MainTableRelatedFields(queryset=RelatedField1.objects.all()) + relfield3 = serializers.CharField() + relfield2 = serializers.CharField() + relfield1 = serializers.CharField() def create(self, validated_data): return self.Meta.model.objects.create(**validated_data)