我想弄清楚如何使用Django REST框架保存相關模型。 在我的應用程序中,我有一個模型Recipe
與2個相關型號:RecipeIngredient
和RecipeStep
。 A Recipe
對象必須至少有3個相關的RecipeIngredient
和3 RecipeStep
。引進REST框架之前,我使用的Django CreateView
有兩個表單集和保存過程如下(按照代碼form_valid()
):Django REST框架:在ModelViewSet中保存相關模型
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()
方法被調用? (is_valid()
在RecipeSerializer
實際上忽略了嵌套關係並僅報告與主要模型Recipe
相關的錯誤)。 目前我試圖覆蓋RecipeSerializer
中的is_valid()
方法,但不是那麼簡單......任何想法?
感謝您的提示,但並非如此簡單......我在validated_data中獲得了一個空的列表成分 – daveoncode 2015-02-12 11:21:54
這可能意味着,您的序列化程序不知道如何從發送給它的數據創建嵌套關係。你確定你要以正確的格式/結構發送數據嗎? – 2015-02-12 11:33:51
這實際上是我的疑問:P我發送一個json,例如:'{「ingredients」:[{「name」:「名稱」,「數量」:「數量」,「unit_of_measure」:「單位」} ,...]}'......應該沒問題......或不? – daveoncode 2015-02-12 11:36:36