I haven't looked at your code in detail, so this may not be the cause
of the problem, but in general it is a bad idea to modify a collection
while you are iterating over it. ie. this is not generally safe:

for tag in edit_post.tags:
    edit_post.tags.remove(tag)

Removing the tag from the "tags" list will confuse the "for" loop.
Instead, you should probably iterate over a *copy* of the list:

tags = list(edit_post.tags)
for tag in tags:
    edit_post.tags.remove(tag)

>From a performance point of view, that's not a great pattern -
edit_post.tags.remove(tag) requires searching the list to find the
item to remove. You might be able to get away with simply writing:

edit_post.tags = []

...depending on how the association proxy is set up. You might also
want to consider using a collection class other than a list here.
Since you want each string to only appear once in the collection, a
set() might be a better choice.

Finally, unless you are doing something special in your Tag()
constructor, this code is going to create new Tag objects even if a
Tag with the same description is already in the database. If this
isn't what you intended, you might want to investigate one of the
approaches at 
https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/UniqueObject.

Hope that helps,

Simon

On Sun, Feb 22, 2015 at 9:27 PM, Asad Dhamani <[email protected]> wrote:
> I looked at my code some more, and found a now obvious mistake. I changed my
> code to:
>
> def edit(id, tags=None):
>     edit_post = Post.query.get(id)
>     if tags is not None and tags != "":
>         for tag in tags.split(','):
>             tag = tag.strip(" ")
>             if tag not in edit_post.tags:
>                 add_tags = Tag()
>                 add_tags.text = tag
>                 edit_post.tags_relationship.append(add_tags)
>                 db.session.add(add_tags)
>                 db.session.commit()
>         for tag in edit_post.tags:
>             if tag not in tags:
>                 edit_post.tags.remove(tag)
>                 db.session.commit()
>     else:
>          for tag in edit_post.tags:
>                 edit_post.tags.remove(tag)
>                 db.session.commit()
>
> However, now if I remove all the tags from a post, a last one remains, and I
> have to remove it again to get rid of all the tags.
>
> On Monday, February 23, 2015 at 1:46:07 AM UTC+5:30, Asad Dhamani wrote:
>>
>> I have a many-to-many relationship in my models. This is what they look
>> like:
>>
>> class Post(db.Model):
>>     __tablename__ = 'Posts'
>>     id = db.Column(db.Integer, primary_key=True)
>>     tags_relationship = db.relationship('Tag', secondary=tags,
>> backref=db.backref('posts', lazy='dynamic'))
>>     tags = association_proxy('tags_relationship', 'text')
>>     full_text = db.Column(db.Text, nullable=True)
>>     fulltext_vector = db.Column(TSVectorType('full_text'))
>>
>>
>>
>> class Tag(db.Model):
>>     id = db.Column(db.Integer, primary_key=True)
>>     text = db.Column(db.String(255))
>>
>>
>> tags = db.Table('tags',
>>                 db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
>>                 db.Column('post', db.Integer, db.ForeignKey('Posts.id'))
>>                 )
>>
>> I need to add the ability to edit tags. I know how to add tags:
>>
>> def edit(id, tags=None):
>>     edit_post = Post.query.get(id)
>>     if tags is not None and tags != "":
>>         for tag in tags.split(','):
>>             tag = tag.strip(" ")
>>             if tag not in edit_post.tags:
>>                 add_tags = Tag()
>>                 add_tags.text = tag
>>                 edit_post.tags_relationship.append(add_tags)
>>                 db.session.add(add_tags)
>>                 db.session.commit()
>>
>> This is what I'm doing for removing tags:
>>
>>         for tag in edit_post.tags:
>>             if tag not in tags:
>>                 edit_post.tags.remove(tag)
>>                 db.session.commit()
>>
>> However, I can not delete the last remaining tag from a post. Once I add a
>> tag, it seems like there has to be a minimum of 1 tag on that post, as I can
>> add more, and I can remove all but the last remaining tag.
>>
>> What am I doing wrong?
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to