Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
D
drf-sqla
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Test Cases
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Web - Open
drf-sqla
Commits
14d9f3f6
Commit
14d9f3f6
authored
Oct 14, 2014
by
ashish
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9 from ashish-gore/modelcache
Support for count in response, misc fixes
parents
96e1bec4
75fcac6a
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
45 additions
and
22 deletions
+45
-22
djangorest_alchemy/apibuilder.py
djangorest_alchemy/apibuilder.py
+0
-1
djangorest_alchemy/managers.py
djangorest_alchemy/managers.py
+20
-6
djangorest_alchemy/serializers.py
djangorest_alchemy/serializers.py
+16
-14
djangorest_alchemy/tests/test_viewsets.py
djangorest_alchemy/tests/test_viewsets.py
+4
-0
djangorest_alchemy/viewsets.py
djangorest_alchemy/viewsets.py
+5
-1
No files found.
djangorest_alchemy/apibuilder.py
View file @
14d9f3f6
...
...
@@ -30,7 +30,6 @@ class APIModelBuilder(object):
router
=
routers
.
SimpleRouter
()
for
model
in
self
.
models
:
manager
=
type
(
str
(
'{}Manager'
.
format
(
model
.
__name__
)),
self
.
base_managers
+
(
AlchemyModelManager
,),
...
...
djangorest_alchemy/managers.py
View file @
14d9f3f6
...
...
@@ -28,7 +28,7 @@ class AlchemyModelManager(object):
try
:
pk
=
primary_key
(
self
.
cls
)
except
KeyNotFoundException
:
return
list
()
pk
=
None
filter_dict
=
dict
()
...
...
@@ -48,14 +48,28 @@ class AlchemyModelManager(object):
query_pks
[
key
]
=
other_pks
[
key
]
query_pks
.
update
(
filter_dict
)
if
pk
:
queryset
=
self
.
session
.
query
(
self
.
cls
.
__dict__
[
pk
]).
filter_by
(
**
query_pks
).
all
()
else
:
queryset
=
self
.
session
.
query
(
self
.
cls
).
filter_by
(
**
query_pks
).
all
()
else
:
if
filter_dict
:
queryset
=
self
.
session
.
query
(
self
.
cls
.
__dict__
[
pk
]).
filter_by
(
if
pk
:
queryset
=
self
.
session
.
query
(
self
.
cls
.
__dict__
[
pk
]).
filter_by
(
**
filter_dict
).
all
()
else
:
queryset
=
self
.
session
.
query
(
self
.
cls
).
filter_by
(
**
filter_dict
).
all
()
else
:
if
pk
:
queryset
=
self
.
session
.
query
(
self
.
cls
.
__dict__
[
pk
]).
all
()
else
:
# Limit to 1000 rows, this is worst case scenario
queryset
=
self
.
session
.
query
(
self
.
cls
).
limit
(
1000
).
all
()
return
queryset
...
...
djangorest_alchemy/serializers.py
View file @
14d9f3f6
...
...
@@ -4,10 +4,10 @@ SQLALchemy and DRF fields to serialize/deserialize objects
'''
from
rest_framework
import
serializers
from
rest_framework.fields
import
(
CharField
,
IntegerField
,
DateTimeField
,
FloatField
,
BooleanField
)
FloatField
,
BooleanField
,
DecimalField
)
from
sqlalchemy.types
import
(
String
,
INTEGER
,
SMALLINT
,
BIGINT
,
VARCHAR
,
CHAR
,
TIMESTAMP
,
DATE
,
Float
,
BigInteger
,
Numeric
,
DateTime
,
Boolean
,
CLOB
)
Numeric
,
DateTime
,
Boolean
,
CLOB
,
DECIMAL
)
from
django.utils.datastructures
import
SortedDict
from
djangorest_alchemy.fields
import
AlchemyRelatedField
,
AlchemyUriField
# inspect introduced in 0.8
...
...
@@ -36,12 +36,15 @@ class AlchemyModelSerializer(serializers.Serializer):
Numeric
:
IntegerField
,
DateTime
:
DateTimeField
,
Boolean
:
BooleanField
,
CLOB
:
CharField
CLOB
:
CharField
,
DECIMAL
:
DecimalField
,
}
def
__init__
(
self
,
*
args
,
**
kwargs
):
assert
"model_class"
in
kwargs
,
\
"model_class should be passed"
assert
'request'
in
kwargs
[
'context'
],
\
"Context must contain request object"
self
.
cls
=
kwargs
.
pop
(
'model_class'
)
super
(
AlchemyModelSerializer
,
self
).
__init__
(
*
args
,
**
kwargs
)
...
...
@@ -52,15 +55,14 @@ class AlchemyModelSerializer(serializers.Serializer):
mapper
=
class_mapper
(
self
.
cls
.
__class__
)
r
=
self
.
context
[
'request'
]
try
:
# URI field for get pk field
pk_field
=
primary_key
(
self
.
cls
.
__class__
)
except
KeyNotFoundException
:
return
ret
r
=
self
.
context
[
'request'
]
ret
[
'href'
]
=
AlchemyUriField
(
source
=
pk_field
,
path
=
r
.
build_absolute_uri
(
r
.
path
))
except
KeyNotFoundException
:
pass
# Get all the Column fields
for
col_prop
in
mapper
.
iterate_properties
:
...
...
@@ -94,12 +96,12 @@ class AlchemyListSerializer(AlchemyModelSerializer):
try
:
# URI field for get pk field
pk_field
=
primary_key
(
self
.
cls
.
__class__
)
except
KeyNotFoundException
:
return
ret
request
=
self
.
context
[
'request'
]
ret
[
"href"
]
=
AlchemyUriField
(
source
=
pk_field
,
path
=
request
.
build_absolute_uri
(
request
.
path
))
path
=
request
.
build_absolute_uri
(
request
.
path
))
except
KeyNotFoundException
:
return
super
(
AlchemyListSerializer
,
self
).
get_default_fields
()
return
ret
djangorest_alchemy/tests/test_viewsets.py
View file @
14d9f3f6
...
...
@@ -22,6 +22,8 @@ from rest_framework.decorators import action
RESULTS_KEY
=
"results"
COUNT_KEY
=
"count"
PAGE_KEY
=
"page"
class
PrimaryKeyMixin
(
object
):
...
...
@@ -104,6 +106,8 @@ class TestAlchemyViewSetIntegration(TestCase):
self
.
assertTrue
(
resp
.
status_code
is
status
.
HTTP_200_OK
)
self
.
assertTrue
(
type
(
resp
.
data
)
is
dict
)
self
.
assertTrue
(
len
(
resp
.
data
[
RESULTS_KEY
])
==
1
)
self
.
assertTrue
(
resp
.
data
[
COUNT_KEY
]
==
1
)
self
.
assertTrue
(
resp
.
data
[
PAGE_KEY
]
==
25
)
def
test_decl_retrieve
(
self
):
resp
=
self
.
client
.
get
(
'/api/declmodels/1/'
)
...
...
djangorest_alchemy/viewsets.py
View file @
14d9f3f6
...
...
@@ -84,6 +84,8 @@ class AlchemyModelViewSet(MultipleObjectMixin, ManagerMixin, viewsets.ViewSet):
queryset
=
mgr
.
list
(
other_pks
=
self
.
get_other_pks
(
request
),
filters
=
request
.
QUERY_PARAMS
)
count
=
len
(
queryset
)
if
self
.
paginate_by
:
try
:
queryset
=
self
.
get_page
(
queryset
)
...
...
@@ -94,7 +96,9 @@ class AlchemyModelViewSet(MultipleObjectMixin, ManagerMixin, viewsets.ViewSet):
mgr
.
model_class
(),
{
'request'
:
request
})
return
Response
({
"results"
:
serializer
.
data
})
return
Response
({
"count"
:
count
,
"page"
:
self
.
paginate_by
,
"results"
:
serializer
.
data
})
def
retrieve
(
self
,
request
,
**
kwargs
):
'''
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment