def save(self, cascade=None, full_clean=True, force_insert=False): """Save this document into MongoDB. If there is no value for the primary key on this Model instance, the instance will be inserted into MongoDB. Otherwise, the entire document will be replaced with this version (upserting if necessary). :parameters: - `cascade`: If ``True``, all dereferenced MongoModels contained in this Model instance will also be saved. - `full_clean`: If ``True``, the :meth:`~pymodm.MongoModel.full_clean` method will be called before persisting this object. - `force_insert`: If ``True``, always do an insert instead of a replace. In this case, `save` will raise :class:`~pymongo.errors.DuplicateKeyError` if a document already exists with the same primary key. :returns: This object, with the `pk` property filled in if it wasn't already. """ cascade = validate_boolean_or_none('cascade', cascade) full_clean = validate_boolean('full_clean', full_clean) force_insert = validate_boolean('force_insert', force_insert) if full_clean: self.full_clean() if cascade or (self._mongometa.cascade and cascade is not False): for field_name in self: for referenced_object in self._find_referenced_objects( getattr(self, field_name)): referenced_object.save() if force_insert or self._mongometa.pk.is_undefined(self): result = self._mongometa.collection.insert_one(self.to_son()) self.pk = result.inserted_id else: result = self._mongometa.collection.replace_one( {'_id': self._mongometa.pk.to_mongo(self.pk)}, self.to_son(), upsert=True) return self