Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validation error on required field when excluded on projection #346

Open
Bernie opened this issue Apr 16, 2021 · 1 comment
Open

Validation error on required field when excluded on projection #346

Bernie opened this issue Apr 16, 2021 · 1 comment

Comments

@Bernie
Copy link

Bernie commented Apr 16, 2021

When a document is fetched with a projection that excludes required fields, one does not expect to receive a validation error on the required field when the projected document is modified and updated back to the DB.

Under normal circumstances, this works:
Update: I am not sure how I got it to work originally, but regardless of what type any other fields are, required fields still fail validation.

@instance.register
class TestModel(Document):                                                                
    required_field = fields.StringField(required=True)                                    
    optional_field = fields.StringField()

# initial insert into DB
TestModel(required_field='a value', optional_field='another value').commit()

# fetch projection and update
projected_test_model = TestModel.find_one({'required_field': 'a value'}, {'optional_field': 1})
projected_test_model.optional_field = 'updated_value'
projected_test_model.commit()

However, when the document includes a ListField, this kind of update appears to be failing because the required field is missing, even though the required field is not actually involved as part of the update:

@instance.register
class TestModelWithList(Document):
    required_field = fields.StringField(required=True)
    optional_fields = fields.ListField(fields.StringField())

# initial insert into DB
TestModelWithList(required_field='a value').commit()

# fetch projection and update
projected_test_model = TestModelWithList.find_one({'required_field': 'a value'}, {'optional_fields': 1})
projected_test_model.optional_fields = ['a new list value']
projected_test_model.commit()

This results in a validation error on the required_field despite the fact that it is not involved in the update:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".venv/lib/python3.8/site-packages/umongo/frameworks/pymongo.py", line 111, in commit
    self.required_validate()
  File ".venv/lib/python3.8/site-packages/umongo/embedded_document.py", line 118, in required_validate
    self._data.required_validate()
  File ".venv/lib/python3.8/site-packages/umongo/data_proxy.py", line 179, in required_validate
    raise ma.ValidationError(errors)
marshmallow.exceptions.ValidationError: {'required_field': ['Missing data for required field.']}

Why should this fail validation when the required field is not needed? I have checked the generated Mongo query, and it appears to be creating an update query that only sets the newly added optional_fields list, as one would expect:

>>> projected_test_model.pk
ObjectId('607a1b6270638a2267962210')
>>> projected_test_model._data.to_mongo(update=True)
{'$set': {'optional_fields': ['a new list value']}}

I would expect this update to work without the unrelated validation failure similar to the first use case that did not involve a ListField.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants