Skip to content

Commit

Permalink
Fix bugs when using filter() with back-references. Refs #1511.
Browse files Browse the repository at this point in the history
  • Loading branch information
coleifer committed Feb 22, 2018
1 parent 3e01236 commit 207a4c5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 11 deletions.
7 changes: 4 additions & 3 deletions peewee.py
Original file line number Diff line number Diff line change
Expand Up @@ -3516,12 +3516,13 @@ def __set__(self, instance, obj):
class BackrefAccessor(object):
def __init__(self, field):
self.field = field
self.model = field.model
self.model = field.rel_model
self.rel_model = field.model

def __get__(self, instance, instance_type=None):
if instance is not None:
dest = self.field.rel_field.name
return (self.model
return (self.rel_model
.select()
.where(self.field == getattr(instance, dest)))
return self
Expand Down Expand Up @@ -5723,7 +5724,7 @@ def filter(self, *args, **kwargs):
lm, rm = field.model, field.rel_model
field_obj = field
elif isinstance(field, BackrefAccessor):
lm, rm = field.field.rel_model, field.rel_model
lm, rm = field.model, field.rel_model
field_obj = field.field
query = query.ensure_join(lm, rm, field_obj)
return query.where(dq_node)
Expand Down
36 changes: 28 additions & 8 deletions tests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,19 @@ def test_from_multi_table(self):
self.assertEqual([t['username'] for t in query],
['huey', 'huey', 'huey'])

@requires_models(User, Tweet)
def test_filtering(self):
self.add_tweets(self.add_user('huey'), 'meow', 'hiss', 'purr')
self.add_tweets(self.add_user('mickey'), 'woof', 'wheeze')

query = Tweet.filter(user__username='huey').order_by(Tweet.content)
self.assertEqual([row.content for row in query],
['hiss', 'meow', 'purr'])

query = User.filter(tweets__content__ilike='w%')
self.assertEqual([user.username for user in query],
['mickey', 'mickey'])

def test_deferred_fk(self):
class Note(TestModel):
foo = DeferredForeignKey('Foo', backref='notes')
Expand Down Expand Up @@ -1538,8 +1551,10 @@ class Admin(BaseUser):
self.assertEqual(BaseUser.account.backref, 'baseuser_set')
self.assertEqual(User.account.backref, 'user_set')
self.assertEqual(Admin.account.backref, 'admin_set')
self.assertTrue(Account.user_set.model is User)
self.assertTrue(Account.admin_set.model is Admin)
self.assertTrue(Account.user_set.model is Account)
self.assertTrue(Account.admin_set.model is Account)
self.assertTrue(Account.user_set.rel_model is User)
self.assertTrue(Account.admin_set.rel_model is Admin)

self.assertSQL(Account._schema._create_table(), (
'CREATE TABLE IF NOT EXISTS "account" ('
Expand Down Expand Up @@ -1573,9 +1588,12 @@ class Photo(BasePost): pass
self.assertEqual(BasePost.category.backref, 'baseposts')
self.assertEqual(Note.category.backref, 'notes')
self.assertEqual(Photo.category.backref, 'photos')
self.assertTrue(Category.baseposts.model is BasePost)
self.assertTrue(Category.notes.model is Note)
self.assertTrue(Category.photos.model is Photo)
self.assertTrue(Category.baseposts.rel_model is BasePost)
self.assertTrue(Category.baseposts.model is Category)
self.assertTrue(Category.notes.rel_model is Note)
self.assertTrue(Category.notes.model is Category)
self.assertTrue(Category.photos.rel_model is Photo)
self.assertTrue(Category.photos.model is Category)

class BaseItem(TestModel):
category = ForeignKeyField(Category, backref='items')
Expand All @@ -1585,9 +1603,11 @@ class ItemB(BaseItem): pass
self.assertEqual(BaseItem.category.backref, 'items')
self.assertEqual(ItemA.category.backref, 'itema_set')
self.assertEqual(ItemB.category.backref, 'itemb_set')
self.assertTrue(Category.items.model is BaseItem)
self.assertTrue(Category.itema_set.model is ItemA)
self.assertTrue(Category.itemb_set.model is ItemB)
self.assertTrue(Category.items.rel_model is BaseItem)
self.assertTrue(Category.itema_set.rel_model is ItemA)
self.assertTrue(Category.itema_set.model is Category)
self.assertTrue(Category.itemb_set.rel_model is ItemB)
self.assertTrue(Category.itemb_set.model is Category)


class TestMetaInheritance(BaseTestCase):
Expand Down

0 comments on commit 207a4c5

Please sign in to comment.