Check if value is already exists in ListProperty of Google Datastore Model in Python

169 views Asked by At

I just start to learn python and I'm also new to Google Datastore Models. So please forgive me if this question looks too noob.

What I'm trying to do is pretty simple.

I'm validating if the user is already liked on a post. So I need to check if a key is inside the ListProperty of the Google Datastore Model. PFB for my code.

@classmethod
def likePost(cls,user_key):
    if user_key not in cls.liked_user:
        cls.liked_user.append(user_key)
        return True
    else:
        return False

The cls is the "Post" object of the Model type from Google Datastore. 'liked_user' is the attribute type ListProperty of the "Post" object.

But apparently, ListProperty is not iterable. Below is the error from console.

TypeError: argument of type 'ListProperty' is not iterable.

So, please help me to figure out how to achieve it.

I tried googling for hours, still cannot figure out how to implement this one.

Thanks in advance.

1

There are 1 answers

3
Daniel Roseman On BEST ANSWER

These properties don't apply to a model class, they apply to individual instances of that model. An instance represents an entity in the datastore, and it is this instance that has a list in its "liked_user" field. It makes no sense to ask if a value is in a class property.

It's not quite clear what you are trying to do here. If you just want to know if a user has already liked another user, then it shouldn't be a classmethod at all; just a normal instance method, which takes the instance.

# no decorator
def likePost(self, user_key):
    if user_key not in self.liked_user:
        self.liked_user.append(user_key)
        return True
    else:
        return False

If however you are trying to find out if any instance has that key in its liked_user, then you need to query the database:

@classmethod
def likePost(cls,user_key):
    users = cls.query(cls.liked_user == user_key).get()
    if users:
        ...