Chris Marasti-Georg
Chris Marasti-Georg

Reputation: 34710

How do I get the key value of a db.ReferenceProperty without a database hit?

Is there a way to get the key (or id) value of a db.ReferenceProperty, without dereferencing the actual entity it points to? I have been digging around - it looks like the key is stored as the property name preceeded with an _, but I have been unable to get any code working. Examples would be much appreciated. Thanks.

EDIT: Here is what I have unsuccessfully tried:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return self._series

And in my template:

<a href="games/view-series.html?series={{comment.series_id}}#comm{{comment.key.id}}">more</a>

The result:

<a href="games/view-series.html?series=#comm59">more</a>

Upvotes: 1

Views: 1259

Answers (2)

Rafe Kaplan
Rafe Kaplan

Reputation:

Actually, the way that you are advocating accessing the key for a ReferenceProperty might well not exist in the future. Attributes that begin with '_' in python are generally accepted to be "protected" in that things that are closely bound and intimate with its implementation can use them, but things that are updated with the implementation must change when it changes.

However, there is a way through the public interface that you can access the key for your reference-property so that it will be safe in the future. I'll revise the above example:

class Comment(db.Model):
    series = db.ReferenceProperty(reference_class=Series);

    def series_id(self):
        return Comment.series.get_value_for_datastore(self)

When you access properties via the class it is associated, you get the property object itself, which has a public method that can get the underlying values.

Upvotes: 13

Nick Johnson
Nick Johnson

Reputation: 101149

You're correct - the key is stored as the property name prefixed with '_'. You should just be able to access it directly on the model object. Can you demonstrate what you're trying? I've used this technique in the past with no problems.

Edit: Have you tried calling series_id() directly, or referencing _series in your template directly? I'm not sure whether Django automatically calls methods with no arguments if you specify them in this context. You could also try putting the @property decorator on the method.

Upvotes: 1

Related Questions