tom
tom

Reputation: 2299

How are default values applied in app engine?

I'd like to know whether default values are applied at the time of instance creation, instance update, or only when attempting to read the value. I'd like to understand how this applies to queries.

For example, suppose I initially create a model w/o default values

class Foo (db.Model):
   bar = db.BooleanProperty()

Then I create and put a few instances of Foo.

Then later I update the model

class Foo (db.Model):
   bar = db.BooleanProperty(default=False)

And then I have a query

foos = Foo.all().filter('bar =', False)

Will the result include the instances of Foo that were created prior to adding the default value to the model definition?

And if I instead query as

foos = Foo.all().filter('bar !=', True)

Does this include the instances of Foo that were created prior to adding the default value to the model definition? Is it (in the case of a Boolean Property) and wrt default values any different to the previous query?

I looked for docs on this, but found none, sorry. Hopefully I'm just missing them. If possible, please provide links to GAE docs.

Update: I found this in the docs

Entities lacking a property named in the query are ignored

Entities of the same kind need not have the same properties. To be eligible as a query result, an entity must possess a value (possibly null) for every property named in the query's filters and sort orders. If not, the entity is omitted from the indexes used to execute the query and consequently will not be included in the query's results.

Note: It is not possible to query for entities that are specifically lacking a given property. One alternative is to define a fixed (modeled) property with a default value of None, then filter for entities with None as the value of that property.

https://cloud.google.com/appengine/docs/python/datastore/queries

Assuming that default values are applied at time of entity creation or update, I believe that means that neither of the above queries would return entities that were last put prior to the default value being added to the model. Is that right?

thanks

Upvotes: 0

Views: 1066

Answers (2)

Patrice
Patrice

Reputation: 4692

It really depends. If you actually put a "bar" in your foo prior to having the default value or not.

1- In the case you never set bar and just "put" foos, then yes, anything you put prior to adding the default value will have nothing as their "bar".

2- In the case you actually programaticaly setup bars for your foos as you create them, then your query will return everything.

The way you phrased your question makes me believe you had it setup with # 1, so no, anything you put in your datastore before the default value wouldn't be returned. You will need to go through your whole datastore and update your foos.

While not in the official documentation, this has been validated in comments by Alex Martelli (a Googler)

Upvotes: 3

Jaime Gomez
Jaime Gomez

Reputation: 7067

The default values are assigned only on when left untouched on entity creation. Updates will keep the original value.

This default value doesn't affect queries in any way, indexes are written when you save the entity, so you would need to write the entity again with the proper value.

Upvotes: 1

Related Questions