from rest_framework import serializers from .models import ( Tag, Ingredient, PantryItem, MetaRecipe, Slot, SlotOption, MetaRecipeBase, Recipe, RecipeIngredient, CookLog, ShoppingListItem, ) class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = "__all__" class IngredientSerializer(serializers.ModelSerializer): tags = TagSerializer(many=True, read_only=True) tag_ids = serializers.PrimaryKeyRelatedField( queryset=Tag.objects.all(), many=True, write_only=True, source="tags", required=False ) class Meta: model = Ingredient fields = "__all__" class PantryItemSerializer(serializers.ModelSerializer): ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) class Meta: model = PantryItem fields = "__all__" # --- Meta-Recipe nested serializers --- class SlotOptionSerializer(serializers.ModelSerializer): ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) class Meta: model = SlotOption fields = "__all__" class SlotSerializer(serializers.ModelSerializer): options = SlotOptionSerializer(many=True, read_only=True) class Meta: model = Slot fields = "__all__" class MetaRecipeBaseSerializer(serializers.ModelSerializer): ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) class Meta: model = MetaRecipeBase fields = "__all__" class MetaRecipeSerializer(serializers.ModelSerializer): slots = SlotSerializer(many=True, read_only=True) base_ingredients = MetaRecipeBaseSerializer(many=True, read_only=True) class Meta: model = MetaRecipe fields = "__all__" # --- Fixed Recipe nested serializers --- class RecipeIngredientSerializer(serializers.ModelSerializer): ingredient_name = serializers.CharField(source="ingredient.name", read_only=True) class Meta: model = RecipeIngredient fields = "__all__" class RecipeSerializer(serializers.ModelSerializer): ingredients = RecipeIngredientSerializer(many=True, read_only=True) class Meta: model = Recipe fields = "__all__" # --- Cook Log & Shopping --- class CookLogSerializer(serializers.ModelSerializer): meta_recipe_name = serializers.CharField(source="meta_recipe.name", read_only=True, default=None) recipe_name = serializers.CharField(source="recipe.name", read_only=True, default=None) class Meta: model = CookLog fields = "__all__" class ShoppingListItemSerializer(serializers.ModelSerializer): ingredient_name = serializers.CharField(source="ingredient.name", read_only=True, default=None) class Meta: model = ShoppingListItem fields = "__all__"