【发布时间】:2015-04-12 01:55:47
【问题描述】:
我试图弄清楚如何使用 Django REST 框架保存相关模型。
在我的应用程序中,我有一个模型 Recipe 和 2 个相关模型:RecipeIngredient 和 RecipeStep。 Recipe 对象必须至少有 3 个相关的 RecipeIngredient 和 3 个 RecipeStep。在引入 REST 框架之前,我使用带有两个表单集的 Django CreateView,保存过程如下(遵循 form_valid() 的代码):
def save_formsets(self, recipe):
for f in self.get_formsets():
f.instance = recipe
f.save()
def save(self, form):
with transaction.atomic():
recipe = form.save()
self.save_formsets(recipe)
return recipe
def formsets_are_valid(self):
return all(f.is_valid() for f in self.get_formsets())
def form_valid(self, form):
try:
if self.formsets_are_valid():
try:
return self.create_ajax_success_response(form)
except IntegrityError as ie:
return self.create_ajax_error_response(form, {'IntegrityError': ie.message})
except ValidationError as ve:
return self.create_ajax_error_response(form, {'ValidationError': ve.message})
return self.create_ajax_error_response(form)
现在我有我的RecipeViewSet:
class RecipeViewSet(ModelViewSet):
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
permission_classes = (RecipeModelPermission, )
使用RecipeSerializer:
class RecipeSerializer(serializers.ModelSerializer):
class Meta:
model = Recipe
fields = (
'name', 'dish_type', 'cooking_time', 'steps', 'ingredients'
)
ingredients = RecipeIngredientSerializer(many=True)
steps = RecipeStepSerializer(many=True)
这些是相关的序列化程序:
class RecipeIngredientSerializer(serializers.ModelSerializer):
class Meta:
model = RecipeIngredient
fields = ('name', 'quantity', 'unit_of_measure')
class RecipeStepSerializer(serializers.ModelSerializer):
class Meta:
model = RecipeStep
fields = ('description', 'photo')
现在...我应该如何验证相关模型(RecipeIngredient 和 RecipeStep)并在调用 RecipeViewSet 的 create() 方法时保存它们? (RecipeSerializer 中的is_valid() 实际上忽略了嵌套关系,只报告与主模型相关的错误Recipe)。
目前我试图覆盖RecipeSerializer中的is_valid()方法,但不是那么简单......有什么想法吗?
【问题讨论】:
标签: django django-forms django-rest-framework formset