Graphene-Django-CRUDDALS
👩🏽💻 🚀 👨🏽💻
Framework for trivial code, easy and fast to learn and use.
Turn your Django-models into a complete GraphQL API with all CRUD operations
Built with ❤︎ by Juan J Cardona and contributors
📋 Table of Contents
- 🚀 Getting started
- 👩💻 Usage
- 🎁 Features
- 📚 Documentation
- 📜 License
- ❤️ Contributing
- 📞 Contact
- 🙏 Acknowledgements
- 🗺️ Roadmap
🚀 Getting started
Prerequisites
To install this project you need to have a Django project already set up. If you don't have one, you can follow the official Django tutorial.
Installation
You can install this package using pip:
pip install graphene-django-cruddals
👩💻 Usage
To use it, simply create a new class that inherits "DjangoModelCruddals"
Suppose we have the following models.
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
is_active = models.BooleanField(default=True)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
is_active = models.BooleanField(default=True)
Then we can create a complete CRUD+DALS for the models Question with the following code
class CruddalsQuestion(DjangoModelCruddals):
class Meta:
model = Question
Now you can use the schema that was generated for you,
schema = CruddalsQuestion.Schema
or use in your existing schema root Query and Mutation
class Query(
# ... your others queries
CruddalsQuestion.Query,
graphene.ObjectType,
):
pass
class Mutation(
# ... your others mutations
CruddalsQuestion.Mutation,
graphene.ObjectType,
):
pass
schema = graphene.Schema( query=Query, mutation=Mutation, )
your schema will have the following queries and mutations
Click to see the generated schema
# Queries
type Query {
readQuestion(where: FilterQuestionInput!): QuestionType
searchQuestions(where: FilterQuestionInput, orderBy: OrderByQuestionInput, paginated: PaginationConfigInput): QuestionPaginatedType
listQuestions: [QuestionType!]
}
# Mutations
type Mutation {
createQuestions(input: [CreateQuestionInput!]): CreateQuestionsPayload
updateQuestions(input: [UpdateQuestionInput!]): UpdateQuestionsPayload
activateQuestions(where: FilterQuestionInput!): ActivateQuestionsPayload
deactivateQuestions(where: FilterQuestionInput!): DeactivateQuestionsPayload
deleteQuestions(where: FilterQuestionInput!): DeleteQuestionsPayload
}
# Inputs
# - From the model: Question
input CreateQuestionInput {
questionText: String!
pubDate: DateTime!
}
input UpdateQuestionInput {
id: ID!
questionText: String
pubDate: DateTime
}
input FilterQuestionInput {
id: IDFilter
questionText: StringFilter
pubDate: DateTimeFilter
AND: [FilterQuestionInput]
OR: [FilterQuestionInput]
NOT: FilterQuestionInput
}
input OrderByQuestionInput {
id: OrderEnum
questionText: OrderStringEnum
pubDate: OrderEnum
}
# - Filters
input IDFilter {
exact: ID
iexact: ID
gt: ID
gte: ID
lt: ID
lte: ID
in: [ID]
contains: ID
icontains: ID
startswith: ID
istartswith: ID
endswith: ID
iendswith: ID
range: [ID]
isnull: Boolean
regex: String
iregex: String
containedBy: ID
}
input StringFilter {
exact: String
iexact: String
gt: String
gte: String
lt: String
lte: String
in: [String]
contains: String
icontains: String
startswith: String
istartswith: String
endswith: String
iendswith: String
range: [String]
isnull: Boolean
regex: String
iregex: String
}
input DateTimeFilter {
exact: DateTime
iexact: DateTime
gt: DateTime
gte: DateTime
lt: DateTime
lte: DateTime
in: [DateTime]
contains: DateTime
icontains: DateTime
startswith: DateTime
istartswith: DateTime
endswith: DateTime
iendswith: DateTime
range: [DateTime]
isnull: Boolean
regex: String
iregex: String
year: DateTime
month: DateTime
day: DateTime
weekDay: DateTime
isoWeekDay: DateTime
week: DateTime
isoYear: DateTime
quarter: DateTime
containedBy: DateTime
hour: DateTime
minute: DateTime
second: DateTime
date: DateTime
time: DateTime
}
# - Pagination
input PaginationConfigInput {
page: Int = 1
itemsPerPage: IntOrAll = "All"
}
# Types
# - From the model: Question
type QuestionType {
id: ID
questionText: String!
pubDate: DateTime!
}
type QuestionPaginatedType implements PaginationInterface {
total: Int
page: Int
pages: Int
hasNext: Boolean
hasPrev: Boolean
indexStart: Int
indexEnd: Int
objects: [QuestionType!]
}
# - Payload the mutations
type CreateQuestionsPayload {
objects: [QuestionType]
errorsReport: [ErrorCollectionType]
}
type UpdateQuestionsPayload {
objects: [QuestionType]
errorsReport: [ErrorCollectionType]
}
type ActivateQuestionsPayload {
objects: [QuestionType]
errorsReport: [ErrorCollectionType]
}
type DeactivateQuestionsPayload {
objects: [QuestionType]
errorsReport: [ErrorCollectionType]
}
type DeleteQuestionsPayload {
objects: [QuestionType]
errorsReport: [ErrorCollectionType]
success: Boolean
}
# - Error
type ErrorCollectionType {
objectPosition: String
errors: [ErrorType]
}
type ErrorType {
field: String!
messages: [String!]!
}
# Interfaces
interface PaginationInterface {
total: Int
page: Int
pages: Int
hasNext: Boolean
hasPrev: Boolean
indexStart: Int
indexEnd: Int
}
# Scalars
"""
The `DateTime` scalar type represents a DateTime
value as specified by
[iso8601](https://en.wikipedia.org/wiki/ISO_8601).
"""
scalar DateTime
"""The page size can be int or 'All'"""
scalar IntOrAll
# Enums
enum OrderEnum {
ASC
DESC
}
enum OrderStringEnum {
ASC
DESC
IASC
IDESC
}
🎉🥳 Now you can use and test in Graphiql 🚀🚀🚀
🎁 Features
| Status | Description |
|---|---|
| ✅ | Done |
| 〰️ | In progress |
| ❌ | Not started |
| Feature | Status | Comments |
|---|---|---|
Generate ObjectType from Django model |
✅ | Pending for documentation |
Generate InputObjectType from Django model |
✅ | Pending for documentation |
Generate Fields from Django model |
✅ | Pending for documentation |
Generate InputFields from Django model |
✅ | Pending for documentation |
Generate Arguments from Django model |
✅ | Pending for documentation |
Generate Mutations from Django model |
✅ | Pending for documentation |
Generate Queries from Django model |
✅ | Pending for documentation |
Generate resolvers from Django model |
✅ | Pending for documentation |
Generate Create operation for a Django model |
✅ | Pending for documentation |
Generate Read operation for a Django model |
✅ | Pending for documentation |
Generate Update operation for a Django model |
✅ | Pending for documentation |
Generate Delete operation for a Django model |
✅ | Pending for documentation |
Generate Deactivate operation for a Django model |
✅ | Pending for documentation |
Generate Activate operation for a Django model |
✅ | Pending for documentation |
Generate List operation for a Django model |
✅ | Pending for documentation |
Generate Search operation for a Django model |
✅ | Pending for documentation |
Generate each operation, all to be performed massively |
✅ | Pending for documentation |
Handle null and blank attribute of Django model |
✅ | Pending for documentation |
Handle editable attribute of Django model |
✅ | Pending for documentation |
Handle help_text attribute of Django model |
✅ | Pending for documentation |
Handle default attribute of Django model |
✅ | Pending for documentation |
Handle choices attribute of Django model |
✅ | Pending for documentation |
Handle OneToOneField field of Django model |
✅ | Pending for documentation |
Handle OneToOneRel field of Django model |
✅ | Pending for documentation |
Handle ManyToManyField field of Django model |
✅ | Pending for documentation |
Handle ManyToManyRel field of Django model |
✅ | Pending for documentation |
Handle ForeignKey field of Django model |
✅ | Pending for documentation |
Handle ManyToOneRel field of Django model |
✅ | Pending for documentation |
Handle GenericForeignKey field of Django model |
✅ | Pending for documentation |
Handle GenericRel field of Django model |
✅ | Pending for documentation |
Handle FileField and ImageField fields of Django Model |
✅ | Pending for documentation |
Handle JSONField field of Django model |
✅ | Pending for documentation |
| Allowing nested mutations at any depth level | ✅ | Pending for documentation |
| Allowing nested queries at any depth level | ✅ | Pending for documentation |
| Handle pagination of query results | ✅ | Pending for documentation |
| Handle sorting of query results | ✅ | Pending for documentation |
| Handle advanced search | ✅ | Pending for documentation |
Handle advanced search with AND operator |
✅ | Pending for documentation |
Handle advanced search with OR operator |
✅ | Pending for documentation |
Handle advanced search with NOT operator |
✅ | Pending for documentation |
Handle advanced search with relational fields operator |
✅ | Pending for documentation |
| Providing a friendly and comprehensive list of errors | ✅ | Pending for documentation |
| Allow use the ObjectTypes generated from the models | ✅ | Pending for documentation |
Allow customizing the ObjectType generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the InputObjectType generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the Fields generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the InputFields generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the Arguments generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the Mutations generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the Queries generated by CRUDDALS |
✅ | Pending for documentation |
Allow customizing the resolvers generated by CRUDDALS |
✅ | Pending for documentation |
Generate all operations at the model, app, or project level |
✅ | Pending for documentation |
| Files for consuming the GraphQL API with any JavaScript client | ✅ | Pending for documentation |
| File with the queries and mutations for with GraphiQL | ✅ | Pending for documentation |
| File with the entire GraphQL schema generated | ✅ | Pending for documentation |
| Handle transactions in mutations | ❌ | Pending for documentation |
| Handle directives in queries and mutations | ❌ | Pending for documentation |
| Handle subscriptions | ❌ | Pending for documentation |
| Optimized queries and mutations | ❌ | Pending for documentation |
| Generate Types for TypeScript | ❌ | Pending for documentation |
| Generate validators for Zod, Yup, others | ❌ | Pending for documentation |
📚 Documentation
You can find the full documentation here, please keep in mind that this is a work in progress.
📜 License
Distributed under the MIT License. See LICENSE for more information.
❤️ Contributing
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated. For more information, please read the CONTRIBUTING.md
📞 Contact
🙏 Acknowledgements
- Python
- Django
- Graphene Django
- Graphene Django CRUD
- Readme Template 1
- Readme Template 2
- and many others
🗺️ Roadmap
- Finish documentation
- Add more examples
- Add more features
- Add tests
- Add localization
- Add SEO
- Add analytics
- Make social marketing
- Add monitoring
- Add logging
- Add CI/CD
- Add collaboration
- Add communication
- Add networking
Metadata
Release files for graphene-django-cruddals 0.1.29
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| graphene_django_cruddals-0.1.29.tar.gz | 86.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| graphene_django_cruddals-0.1.29-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 141.8 kB
Release files / graphene_django_cruddals-0.1.29.tar.gz
| Download URL | graphene_django_cruddals-0.1.29.tar.gz |
|---|---|
| Size | 86.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dc3f37a7006965b8311780d14254dcf1965e7646ee6e5e532b6d77e6c44e6ae0
|
|
BLAKE2b-256 checksum How to use checksums |
1fe5a4b39361a9ac4ce02642ac7d238cb126d9aca627143a6606af983628ac01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / graphene_django_cruddals-0.1.29-py3-none-any.whl
| Download URL | graphene_django_cruddals-0.1.29-py3-none-any.whl |
|---|---|
| Size | 55.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
016aa75ebce18f18738fc9431e0c77ee74df587a727d138d028852df3f9364db
|
|
BLAKE2b-256 checksum How to use checksums |
cea1b1f93590d1f360bcc001926f2893ffbc5331286336032b2c58e032227fda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|