def test_reverse_o2o_prefetch(self): # Create profiles for i in range(1, 4): Profile.objects.create( user=User.objects.get(pk=i), display_name='User %s' % i ) with self.assertNumQueries(2): q = FastQuery(User.objects.all()) q.prefetch_related( FastPrefetch( 'profile', Profile.objects.all() ) ) result = q.execute() self.assertTrue( all(['profile' in _ for _ in result]) ) user = sorted( result, key=lambda x: 1 if x['profile'] is None else 0 )[0] self.assertEquals( set(['display_name', 'user_id', 'id', 'thumbnail_url']), set(user['profile'].keys()) )
def test_nested_prefetch_by_string(self): q = FastQuery(Location.objects.filter(pk=1)) q.prefetch_related('user_set__groups') out = list(q) self.assertTrue('user_set' in out[0]) self.assertTrue('groups' in out[0]['user_set'][0])
def test_o2o_prefetch(self): # Create profiles for i in range(1, 4): Profile.objects.create( user=User.objects.get(pk=i), display_name='User %s' % i ) with self.assertNumQueries(2): q = FastQuery(Profile.objects.all()) q.prefetch_related( FastPrefetch( 'user', User.objects.all() ) ) result = q.execute() self.assertTrue( all([_['user'] for _ in result]) ) self.assertEquals( self._user_keys(), set(result[0]['user'].keys()) )
def test_get_with_prefetch(self): # FastQuery.get() should apply prefetch filters correctly self.assertTrue( Cat.objects.filter(home=1, backup_home=3).exists() ) q = FastQuery(Location.objects.all()) q.prefetch_related( FastPrefetch( 'friendly_cats', Cat.objects.filter(home__gt=1) ) ) obj = q.get(pk=3) self.assertEquals(0, obj.friendly_cats.count())
def test_pagination(self): r = list(FastQuery(User.objects.all())) self.assertTrue(isinstance(r, list)) r = FastQuery(User.objects.order_by('id'))[1] self.assertEquals(1, len(r)) self.assertEquals(r[0]['id'], 2) r = FastQuery(User.objects.order_by('id'))[1:3] self.assertEquals(2, len(r)) self.assertEquals(r[0]['id'], 2) self.assertEquals(r[1]['id'], 3) with self.assertRaises(TypeError): FastQuery(User.objects.all())[:10:2]
def test_fk_prefetch(self): with self.assertNumQueries(2): q = FastQuery(User.objects.all()) q.prefetch_related( FastPrefetch( 'location', Location.objects.all() ) ) result = q.execute() self.assertTrue( all([_['location'] for _ in result]) ) self.assertEquals( set(['blob', 'id', 'name']), set(result[0]['location'].keys()) )
def _get_queryset(self, queryset=None, serializer=None): queryset = super(FastDynamicFilterBackend, self)._get_queryset(queryset=queryset, serializer=serializer) if not isinstance(queryset, FastQuery): queryset = FastQuery(queryset) return queryset
def test_m2m_prefetch(self): with self.assertNumQueries(3): q = FastQuery(User.objects.all()) q.prefetch_related( FastPrefetch( 'groups', Group.objects.all() ) ) result = q.execute() self.assertTrue( all([_['groups'] for _ in result]) ) self.assertTrue( isinstance(result[0]['groups'], list) ) self.assertEquals( set(['id', 'name']), set(result[0]['groups'][0].keys()) )
def test_m2o_prefetch(self): with self.assertNumQueries(2): q = FastQuery(Location.objects.all()) q.prefetch_related( FastPrefetch( 'user_set', User.objects.all() ) ) result = q.execute() self.assertTrue( all(['user_set' in obj for obj in result]) ) location = six.next(( o for o in result if o['user_set'] and len(o['user_set']) > 1 )) self.assertIsNotNone(location) self.assertEquals( self._user_keys(), set(location['user_set'][0].keys()) )
def _make_model_queryset(self, model): queryset = super(FastDynamicFilterBackend, self)._make_model_queryset(model) return FastQuery(queryset)