Skip to content

Commit 0c348e3

Browse files
committed
Docs: Start Migration to 2.0.0 and changes
1 parent 575623a commit 0c348e3

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

docs/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ You can also use `WTForms <http://wtforms.simplecodes.com/>`_ as model forms for
1313
flask_config
1414
db_model
1515
forms
16+
migration_to_v2
1617
custom_queryset
1718
wtf_forms
1819
session_interface

docs/migration_to_v2.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# Migration to 2.0.0 and changes
2+
3+
## Empty fields are not created in database
4+
5+
If you are already aware about empty string vs `None` database conflicts, you should
6+
know that some string based generated forms behaviour are not consistent between
7+
version **<=1.0.0** and **2.0.0+**.
8+
9+
In version **2.0.0** all fields with empty strings will be considered as `None` and
10+
will not be saved by default (this is easy to change for particular field to keep
11+
old behaviour for existed projects).
12+
13+
This behaviour is different from previous versions, where
14+
{class}`~flask_mongoengine.db_fields.StringField` consider empty string as valid
15+
value, and save it to database. This is the opposite behavior against original
16+
[mongoengine] project and related database.
17+
18+
```{warning}
19+
To keep easy migration and correct deprecation steps {func}`~.model_form` and
20+
{func}`.model_fields` still keep old behaviour.
21+
```
22+
23+
To be completely clear, let look on example. Let make a completely meaningless model,
24+
with all field types from [mongoengine], like this:
25+
26+
```python
27+
"""example_app.models.py"""
28+
from flask_mongoengine import MongoEngine
29+
30+
db = MongoEngine()
31+
32+
33+
class Todo(db.Document):
34+
"""Test model for AllFieldsModel."""
35+
string = db.StringField()
36+
37+
38+
class Embedded(db.EmbeddedDocument):
39+
"""Test embedded for AllFieldsModel."""
40+
string = db.StringField()
41+
42+
43+
class AllFieldsModel(db.Document):
44+
"""Meaningless Document with all field types."""
45+
binary_field = db.BinaryField()
46+
boolean_field = db.BooleanField()
47+
date_field = db.DateField()
48+
date_time_field = db.DateTimeField()
49+
decimal_field = db.DecimalField()
50+
dict_field = db.DictField()
51+
email_field = db.EmailField()
52+
embedded_document_field = db.EmbeddedDocumentField(document_type=Embedded)
53+
file_field = db.FileField()
54+
float_field = db.FloatField()
55+
int_field = db.IntField()
56+
list_field = db.ListField(field=db.StringField)
57+
reference_field = db.ReferenceField(document_type=Todo)
58+
sorted_list_field = db.SortedListField(field=db.StringField)
59+
string_field = db.StringField()
60+
url_field = db.URLField()
61+
cached_reference_field = db.CachedReferenceField(document_type=Todo)
62+
complex_date_time_field = db.ComplexDateTimeField()
63+
dynamic_field = db.DynamicField()
64+
embedded_document_list_field = db.EmbeddedDocumentListField(document_type=Embedded)
65+
enum_field = db.EnumField(enum=[1, 2])
66+
generic_embedded_document_field = db.GenericEmbeddedDocumentField()
67+
generic_lazy_reference_field = db.GenericLazyReferenceField()
68+
geo_json_base_field = db.GeoJsonBaseField()
69+
geo_point_field = db.GeoPointField()
70+
image_field = db.ImageField()
71+
lazy_reference_field = db.LazyReferenceField(document_type=Todo)
72+
line_string_field = db.LineStringField()
73+
long_field = db.LongField()
74+
map_field = db.MapField(field=db.StringField())
75+
multi_line_string_field = db.MultiLineStringField()
76+
multi_point_field = db.MultiPointField()
77+
multi_polygon_field = db.MultiPolygonField()
78+
point_field = db.PointField()
79+
polygon_field = db.PolygonField()
80+
sequence_field = db.SequenceField()
81+
uuid_field = db.UUIDField()
82+
generic_reference_field = db.GenericReferenceField(document_type=Todo)
83+
object_id_field = db.ObjectIdField()
84+
```
85+
86+
Now let's make an example instance of such object and save it to db.
87+
88+
```python
89+
from example_app.models import AllFieldsModel
90+
91+
obj = AllFieldsModel()
92+
obj.save()
93+
```
94+
95+
On database side this document will be created:
96+
97+
```json
98+
{
99+
"_id": {
100+
"$oid": "62df93ac3fe82c8656aae60d"
101+
},
102+
"dict_field": {},
103+
"list_field": [],
104+
"sorted_list_field": [],
105+
"embedded_document_list_field": [],
106+
"map_field": {},
107+
"sequence_field": 1
108+
}
109+
```
110+
111+
For empty form Flask-Mongoengine **2.0.0** will create exactly the same document,
112+
old project version will try to fill some fields, based on
113+
{class}`~flask_mongoengine.db_fields.StringField`.
114+
115+
[mongoengine]: https://docs.mongoengine.org/

0 commit comments

Comments
 (0)