Я не думаю, что это будет работать так. Вы должны помнить, что если вы введете такие значения, они в конечном итоге будут храниться в БД, и это жестко закодированные значения. Даже если вы настаиваете на том, чтобы делать это следующим образом, используйте список словаря, подобный этому:
request.data['phone_number'] = [{'number': '9999999999'}]
request.data['cont_email'] = [{'email':'tim@gmail.com'}]
И обновите сериализатор следующим образом:
class CrmContactSerializer(serializers.ModelSerializer):
phone_number = PhoneNumberSerializer(source = 'contact_number', many=True)
cont_email = ContactEmailSerializer(source = 'contact_email', many=True)
class Meta:
model = RestaurantContactAssociation
fields = ('id','phone_number','cont_email','contact')
def create(self, validated_data):
phone_number = validated_data.pop('contact_number')
cont_email = validated_data.pop('contact_email')
restaurant = super(CrmContactSerializer, self).create(validated_data)
phone_instance = PhoneNumber(**phone_number)
phone_instance.restaurant = restaurant
phone_instance.save()
email_instance = ContactEmail(**phone_number)
email_instance.restaurant = restaurant
email_instance.save()
return restaurant
Причина для many=True
есть что один и тот же ресторан может иметь несколько номеров или адресов электронной почты (так как он имеет отношение один ко многим с соответствующими моделями).
Теперь, если вы подумаете о правильном способе реализации, вы можете заставить phone_number
и cont_email
читать только поля, так что он будет использоваться только при чтении, а не при записи:
class CrmContactSerializer(serializers.ModelSerializer):
phone_number = PhoneNumberSerializer(source = 'contact_number', read_only=True)
cont_email = ContactEmailSerializer(source = 'contact_email', read_only=True)
class Meta:
model = RestaurantContactAssociation
fields = ('id','phone_number','cont_email','contact')
Таким образом, ошибка проверки может быть обработана для номера телефона и продолжения электронной почты.