增加 ingredient 和 recipe-ingredient model; 增加相关 API Signed-off-by: Ching <loooching@gmail.com>
81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
from rest_framework import serializers
|
|
|
|
import recipe.models
|
|
from utils import const
|
|
|
|
|
|
class IngredientSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = recipe.models.Ingredient
|
|
fields = '__all__'
|
|
|
|
|
|
class RecipeIngredientSerializer(serializers.ModelSerializer):
|
|
id = serializers.IntegerField(read_only=True)
|
|
ingredient = IngredientSerializer()
|
|
|
|
def update(self, instance, validated_data):
|
|
if 'ingredient' in validated_data:
|
|
validated_data.pop('ingredient')
|
|
if 'recipe' in validated_data:
|
|
validated_data.pop('recipe')
|
|
return super().update(instance, validated_data)
|
|
|
|
class Meta:
|
|
model = recipe.models.RecipeIngredient
|
|
fields = '__all__'
|
|
|
|
|
|
class RecipeSerializer(serializers.ModelSerializer):
|
|
id = serializers.IntegerField(read_only=True)
|
|
recipe_ingredients = RecipeIngredientSerializer(many=True)
|
|
|
|
def update(self, instance, validated_data):
|
|
if 'recipe_ingredients' in validated_data:
|
|
recipe_ingredients = validated_data.pop('recipe_ingredients')
|
|
if recipe_ingredients:
|
|
for recipe_ingredient in recipe_ingredients:
|
|
recipe_ingredient['recipe'] = instance
|
|
RecipeIngredientSerializer.update(recipe_ingredient)
|
|
return super().update(instance, validated_data)
|
|
|
|
def create(self, validated_data):
|
|
if 'recipe_ingredients' in validated_data:
|
|
recipe_ingredients = validated_data.pop('recipe_ingredients')
|
|
instance = super().create(validated_data)
|
|
if recipe_ingredients:
|
|
for recipe_ingredient in recipe_ingredients:
|
|
recipe_ingredient['recipe'] = instance
|
|
RecipeIngredientSerializer.create(recipe_ingredient)
|
|
return instance
|
|
|
|
@property
|
|
def data(self):
|
|
# exclude deleted recipe_ingredients
|
|
data_ = super().data
|
|
data_['recipe_ingredients'] = [
|
|
ingredient
|
|
for ingredient in data_['recipe_ingredients']
|
|
if ingredient['status'] != const.INGREDIENT_STATUS_DELETED
|
|
]
|
|
return data_
|
|
|
|
class Meta:
|
|
model = recipe.models.Recipe
|
|
fields = ('recipe_ingredients', 'id', 'name', 'recipe_type', 'status', 'note', 'rate', 'difficulty')
|
|
|
|
|
|
class WeekRecipeSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = recipe.models.DailyRecipe
|
|
fields = '__all__'
|
|
|
|
|
|
class DailyRecipeSerializer(serializers.ModelSerializer):
|
|
id = serializers.IntegerField(read_only=True)
|
|
recipes = RecipeSerializer(many=True)
|
|
|
|
class Meta:
|
|
model = recipe.models.DailyRecipe
|
|
fields = '__all__'
|