这是我的代码:
楷模
class Recipe(models.Model):
name = models.CharField(max_length=50, unique=True)
ingredient = models.ManyToManyField(Ingredient)
class Ingredient(models.Model):
name = models.CharField(max_length=50, unique=True)
Run Code Online (Sandbox Code Playgroud)
看法
class RecipeDetailAPIView(RetrieveUpdateDestroyAPIView):
permission_classes = (IsAdminOrReadOnly,)
serializer_class = RecipeSerializer
queryset = Recipe.objects.all()
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def perform_update(self, serializer):
serializer.save(updated_by_user=self.request.user)
Run Code Online (Sandbox Code Playgroud)
序列化器
class IngredientSerializer(serializers.ModelSerializer):
class Meta:
model = Ingredient
fields = [
'id',
'name',
]
class RecipeSerializer(serializers.ModelSerializer):
ingredient = IngredientSerializer(many=True, read_only=False)
class Meta:
model = Recipe
fields = [
'id',
'name',
'ingredient',
]
Run Code Online (Sandbox Code Playgroud)
我从以下 Recipe 对象开始:
{
"id": 91 …
Run Code Online (Sandbox Code Playgroud) 在DRF中使用可写嵌套序列化程序时,验证最终唯一字段并阻止更新父序列化程序存在已知问题.在这样的问题中已多次询问此问题:
为简单起见,我们以第一个问题为例:
class GenreSerializer(serializers.ModelSerializer):
class Meta:
fields = ('name',) #This field is unique
model = Genre
extra_kwargs = {
'name': {'validators': []},
}
class BookSerializer(serializers.ModelSerializer):
genre = GenreSerializer()
class Meta:
model = Book
fields = ('name', 'genre')
def create(self, validated_data):
# implement creating
def update(self, instance, validated_data):
# implement updating
Run Code Online (Sandbox Code Playgroud)
现在问题是,唯一性验证也被删除以用于创建.这可以在视图中截获,例如:
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer = BookSerializer
def perform_create(self):
# implement logic and raise ValidationError
Run Code Online (Sandbox Code Playgroud)
然而,这感觉不太对,因为我们正在验证Genre
in 的唯一性BookViewSet
.
另一种选择是在第二个问题中解释的 …