Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/2degrees/djeneralize
Generalization of specialized models for Django
https://github.com/2degrees/djeneralize
Last synced: about 2 months ago
JSON representation
Generalization of specialized models for Django
- Host: GitHub
- URL: https://github.com/2degrees/djeneralize
- Owner: 2degrees
- License: bsd-3-clause
- Archived: true
- Created: 2011-01-20T11:59:37.000Z (almost 14 years ago)
- Default Branch: master
- Last Pushed: 2020-02-11T21:46:54.000Z (almost 5 years ago)
- Last Synced: 2024-09-01T13:19:13.986Z (3 months ago)
- Language: Python
- Homepage: http://packages.python.org/djeneralize/
- Size: 121 KB
- Stars: 43
- Watchers: 11
- Forks: 6
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# djeneralize
Generalizations of specialized models for Django.
**djeneralize is not longer under development!**
## Migrating from djeneralize
We have had success migrating djeneralize models to
[django-polymorphic](https://pypi.python.org/pypi/django_polymorphic). The
following procedure has worked for us:1. replace `BaseGeneralizationModel` with `PolymorphicModel`
2. remove all `Meta.specialization_type` attributes
3. replace all `Model.specializations` calls with `Model.objects` calls
4. remove all `as_specialization()` calls
5. run `makemigrations`
6. manually add migration calling `reset_polymorphic_ctypes` on all Polymorphic
models
7. run `migrate`### Example Model Changes and Migrations
For the following djeneralize example model:
```python
from django.db.models.fields import CharField, DateTimeField, ForeignKey, \
TextField, DecimalField
from djeneralize.models import BaseGeneralizationModel
class Question(BaseGeneralizationModel):
wording = CharField(max_length=256)
class TextQuestion(Question):
class Meta:
specialization = 'text'
class NumericQuestion(Question):
unit = CharField(max_length=2)
class Meta:
specialization = 'numeric'
class Answer(BaseGeneralizationModel):
timestamp = DateTimeField(null=True)
class TextAnswer(Answer):
question = ForeignKey(TextQuestion, related_name='answers')
value = TextField()
class Meta:
specialization = 'text'
class NumericAnswer(Answer):
question = ForeignKey(NumericQuestion, related_name='answers')
value = DecimalField()
class Meta:
specialization = 'numeric'
```modify it to become:
```python
from django.db.models.fields import CharField, DateTimeField, ForeignKey, \
TextField, DecimalField
from polymorphic.models import PolymorphicModel
class Question(PolymorphicModel):
wording = CharField(max_length=256)
class TextQuestion(Question):
pass
class NumericQuestion(Question):
unit = CharField(max_length=2)
class Answer(PolymorphicModel):
timestamp = DateTimeField(null=True)
class TextAnswer(Answer):
question = ForeignKey(TextQuestion, related_name='answers')
value = TextField()
class NumericAnswer(Answer):
question = ForeignKey(NumericQuestion, related_name='answers')
value = DecimalField()
```Now run `manage.py makemigrations`; imagining that this creates the file `myapp/migrations/0002_auto_20170928_1100.py`
you must now make the following file (`myapp/migrations/0003_this_name_does_not_matter.py`):```python
from __future__ import unicode_literals
from django.db import migrations
from polymorphic.utils import reset_polymorphic_ctype
def _update_content_types(apps, schema_editor):
answer_model = apps.get_model('myapp', 'Answer')
numeric_answer_model = apps.get_model('myapp', 'NumericAnswer')
text_answer_model = apps.get_model('myapp', 'TextAnswer')
question_model = apps.get_model('myapp', 'Question')
numeric_question_model = apps.get_model('myapp', 'NumericQuestion')
text_question_model = apps.get_model('myapp', 'TextQuestion')
reset_polymorphic_ctype(
answer_model,
text_answer_model,
numeric_answer_model,
)
reset_polymorphic_ctype(
question_model,
text_question_model,
numeric_question_model,
)
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_auto_20170928_1100'),
]
operations = [
migrations.RunPython(_update_content_types, migrations.RunPython.noop)
]```
Now run `manage.py migrate` and your models should be consistent.
You will have to look through your code to find uses of `djeneralize` specifics,
but we have had no issues in swapping these for `Polymorphic` patterns.