from rest_framework import serializers as ser from .models import Recipe, Ingredient, IngredientWithAmount class RecipeSerializer(ser.ModelSerializer): class Meta: model = Recipe fields = ('id', 'name', 'category', 'ingredients') class IngredientSerializer(ser.ModelSerializer): class Meta: model = Ingredient fields = ('id', 'name') class IngredientWithAmountSerializer(ser.ModelSerializer): ingredient = IngredientSerializer() class Meta: model = IngredientWithAmount fields = ('recipe', 'ingredient', 'amount', 'unit', 'display') extra_kwargs = { 'recipe': { 'write_only': True }, } def create(self, validated_data): # TODO: better management of ingredient finding ingredient, created = Ingredient.objects.get_or_create( **validated_data.pop('ingredient') ) if created: ingredient.save() validated_data['ingredient'] = ingredient return IngredientWithAmount.objects.create( **validated_data ) def update(self, instance, validated_data): for attr in ('recipe', 'amount', 'unit'): setattr( instance, attr, validated_data.get(attr, getattr(instance, attr)) ) if 'ingredient' in validated_data: ingdt, created = Ingredient.objects.get_or_create( **validated_data['ingredient'] ) if created: ingdt.save() instance.ingredient = ingdt instance.save() return instance