57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
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
|