Model cleanups for example app and it's management commands

fix_request_path_info
Diederik van der Boor 2016-06-13 11:08:34 +02:00
parent 819be4b602
commit fea5f5a77e
8 changed files with 120 additions and 243 deletions

View File

@ -26,36 +26,6 @@ admin.site.register(ArtProject, ProjectChildAdmin)
admin.site.register(ResearchProject, ProjectChildAdmin) admin.site.register(ResearchProject, ProjectChildAdmin)
class ModelAAdmin(PolymorphicParentModelAdmin):
base_model = ModelA
list_filter = (PolymorphicChildModelFilter,)
child_models = (ModelA, ModelB, ModelC)
class ModelAChildAdmin(PolymorphicChildModelAdmin):
base_model = ModelA
admin.site.register(ModelA, ModelAAdmin)
admin.site.register(ModelB, ModelAChildAdmin)
admin.site.register(ModelC, ModelAChildAdmin)
class Model2AAdmin(PolymorphicParentModelAdmin):
base_model = Model2A
list_filter = (PolymorphicChildModelFilter,)
child_models = (Model2A, Model2B, Model2C)
class Model2AChildAdmin(PolymorphicChildModelAdmin):
base_model = Model2A
admin.site.register(Model2A, Model2AAdmin)
admin.site.register(Model2B, Model2AChildAdmin)
admin.site.register(Model2C, Model2AChildAdmin)
class UUIDModelAAdmin(PolymorphicParentModelAdmin): class UUIDModelAAdmin(PolymorphicParentModelAdmin):
base_model = UUIDModelA base_model = UUIDModelA
list_filter = (PolymorphicChildModelFilter,) list_filter = (PolymorphicChildModelFilter,)

View File

@ -3,11 +3,7 @@
This module is a scratchpad for general development, testing & debugging This module is a scratchpad for general development, testing & debugging
Well, even more so than pcmd.py. You best ignore p2cmd.py. Well, even more so than pcmd.py. You best ignore p2cmd.py.
""" """
import uuid
import django
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.db import connection
from pprint import pprint from pprint import pprint
import time import time
import sys import sys
@ -16,7 +12,7 @@ from pexp.models import *
def reset_queries(): def reset_queries():
if django.VERSION < (1, 9): if django.VERSION < (1, 8):
connection.queries = [] connection.queries = []
else: else:
connection.queries_log.clear() connection.queries_log.clear()
@ -58,20 +54,20 @@ class Command(NoArgsCommand):
def handle_noargs(self, **options): def handle_noargs(self, **options):
if False: if False:
ModelA.objects.all().delete() TestModelA.objects.all().delete()
a = ModelA.objects.create(field1='A1') a = TestModelA.objects.create(field1='A1')
b = ModelB.objects.create(field1='B1', field2='B2') b = TestModelB.objects.create(field1='B1', field2='B2')
c = ModelC.objects.create(field1='C1', field2='C2', field3='C3') c = TestModelC.objects.create(field1='C1', field2='C2', field3='C3')
reset_queries() reset_queries()
print ModelC.base_objects.all() print TestModelC.base_objects.all()
show_queries() show_queries()
if False: if False:
ModelA.objects.all().delete() TestModelA.objects.all().delete()
for i in xrange(1000): for i in xrange(1000):
a = ModelA.objects.create(field1=str(i % 100)) a = TestModelA.objects.create(field1=str(i % 100))
b = ModelB.objects.create(field1=str(i % 100), field2=str(i % 200)) b = TestModelB.objects.create(field1=str(i % 100), field2=str(i % 200))
c = ModelC.objects.create(field1=str(i % 100), field2=str(i % 200), field3=str(i % 300)) c = TestModelC.objects.create(field1=str(i % 100), field2=str(i % 200), field3=str(i % 300))
if i % 100 == 0: if i % 100 == 0:
print i print i
@ -83,11 +79,11 @@ class Command(NoArgsCommand):
return return
nModelA.objects.all().delete() NormalModelA.objects.all().delete()
a = nModelA.objects.create(field1='A1') a = NormalModelA.objects.create(field1='A1')
b = nModelB.objects.create(field1='B1', field2='B2') b = NormalModelB.objects.create(field1='B1', field2='B2')
c = nModelC.objects.create(field1='C1', field2='C2', field3='C3') c = NormalModelC.objects.create(field1='C1', field2='C2', field3='C3')
qs = ModelA.objects.raw("SELECT * from pexp_modela") qs = TestModelA.objects.raw("SELECT * from pexp_testmodela")
for o in list(qs): for o in list(qs):
print o print o
@ -99,14 +95,14 @@ rnd = Random()
def poly_sql_query(): def poly_sql_query():
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute(""" cursor.execute("""
SELECT id, pexp_modela.field1, pexp_modelb.field2, pexp_modelc.field3 SELECT id, pexp_testmodela.field1, pexp_testmodelb.field2, pexp_testmodelc.field3
FROM pexp_modela FROM pexp_testmodela
LEFT OUTER JOIN pexp_modelb LEFT OUTER JOIN pexp_testmodelb
ON pexp_modela.id = pexp_modelb.modela_ptr_id ON pexp_testmodela.id = pexp_testmodelb.testmodela_ptr_id
LEFT OUTER JOIN pexp_modelc LEFT OUTER JOIN pexp_testmodelc
ON pexp_modelb.modela_ptr_id = pexp_modelc.modelb_ptr_id ON pexp_testmodelb.testmodela_ptr_id = pexp_testmodelc.testmodelb_ptr_id
WHERE pexp_modela.field1=%i WHERE pexp_testmodela.field1=%i
ORDER BY pexp_modela.id ORDER BY pexp_testmodela.id
""" % rnd.randint(0, 100) ) """ % rnd.randint(0, 100) )
# row=cursor.fetchone() # row=cursor.fetchone()
return return
@ -115,10 +111,10 @@ def poly_sql_query():
def poly_sql_query2(): def poly_sql_query2():
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute(""" cursor.execute("""
SELECT id, pexp_modela.field1 SELECT id, pexp_testmodela.field1
FROM pexp_modela FROM pexp_testmodela
WHERE pexp_modela.field1=%i WHERE pexp_testmodela.field1=%i
ORDER BY pexp_modela.id ORDER BY pexp_testmodela.id
""" % rnd.randint(0, 100) ) """ % rnd.randint(0, 100) )
# row=cursor.fetchone() # row=cursor.fetchone()
return return

View File

@ -5,7 +5,6 @@ This module is a scratchpad for general development, testing & debugging.
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.db import connection from django.db import connection
from pprint import pprint
from pexp.models import * from pexp.models import *
@ -14,14 +13,6 @@ def reset_queries():
connection.queries = [] connection.queries = []
def show_queries():
print
print 'QUERIES:', len(connection.queries)
pprint(connection.queries)
print
connection.queries = []
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""
@ -33,9 +24,9 @@ class Command(NoArgsCommand):
print Project.objects.all() print Project.objects.all()
print print
ModelA.objects.all().delete() TestModelA.objects.all().delete()
a = ModelA.objects.create(field1='A1') a = TestModelA.objects.create(field1='A1')
b = ModelB.objects.create(field1='B1', field2='B2') b = TestModelB.objects.create(field1='B1', field2='B2')
c = ModelC.objects.create(field1='C1', field2='C2', field3='C3') c = TestModelC.objects.create(field1='C1', field2='C2', field3='C3')
print ModelA.objects.all() print TestModelA.objects.all()
print print

View File

@ -3,7 +3,6 @@
This module is a scratchpad for general development, testing & debugging This module is a scratchpad for general development, testing & debugging
""" """
import django
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.db import connection from django.db import connection
from pprint import pprint from pprint import pprint
@ -14,7 +13,7 @@ num_objects = 1000
def reset_queries(): def reset_queries():
if django.VERSION < (1, 9): if django.VERSION < (1, 8):
connection.queries = [] connection.queries = []
else: else:
connection.queries_log.clear() connection.queries_log.clear()
@ -57,9 +56,9 @@ def print_timing(func, message='', iterations=1):
def run_vanilla_any_poly(func, iterations=1): def run_vanilla_any_poly(func, iterations=1):
f = print_timing(func, ' ', iterations) f = print_timing(func, ' ', iterations)
f(nModelC) f(NormalModelC)
f = print_timing(func, 'poly ', iterations) f = print_timing(func, 'poly ', iterations)
f(ModelC) f(TestModelC)
################################################################################### ###################################################################################

View File

@ -4,24 +4,10 @@ This module is a scratchpad for general development, testing & debugging
""" """
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.db import connection
from pprint import pprint
from pexp.models import * from pexp.models import *
def reset_queries():
connection.queries = []
def show_queries():
print
print 'QUERIES:', len(connection.queries)
pprint(connection.queries)
print
connection.queries = []
class Command(NoArgsCommand): class Command(NoArgsCommand):
help = "" help = ""

View File

@ -1,53 +1,28 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9b1 on 2015-10-23 22:20
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
import polymorphic.showfields import polymorphic.showfields
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True
dependencies = [ dependencies = [
('contenttypes', '0002_remove_content_type_name'), ('contenttypes', '0002_remove_content_type_name'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Model2A', name='NormalModelA',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('field1', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='ModelA',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field1', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model),
),
migrations.CreateModel(
name='nModelA',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field1', models.CharField(max_length=10)), ('field1', models.CharField(max_length=10)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='Project', name='Project',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('topic', models.CharField(max_length=30)), ('topic', models.CharField(max_length=30)),
], ],
options={ options={
@ -58,18 +33,29 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='ProxyBase', name='ProxyBase',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=200)), ('title', models.CharField(max_length=200)),
('polymorphic_ctype', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_pexp.proxybase_set+', to='contenttypes.ContentType')), ('polymorphic_ctype', models.ForeignKey(related_name='polymorphic_pexp.proxybase_set+', editable=False, to='contenttypes.ContentType', null=True)),
], ],
options={ options={
'ordering': ('title',), 'ordering': ('title',),
}, },
), ),
migrations.CreateModel(
name='TestModelA',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('field1', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
bases=(polymorphic.showfields.ShowFieldTypeAndContent, models.Model),
),
migrations.CreateModel( migrations.CreateModel(
name='UUIDModelA', name='UUIDModelA',
fields=[ fields=[
('uuid_primary_key', models.UUIDField(primary_key=True, serialize=False)), ('uuid_primary_key', models.UUIDField(serialize=False, primary_key=True)),
('field1', models.CharField(max_length=10)), ('field1', models.CharField(max_length=10)),
], ],
options={ options={
@ -80,7 +66,7 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='ArtProject', name='ArtProject',
fields=[ fields=[
('project_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.Project')), ('project_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.Project')),
('artist', models.CharField(max_length=30)), ('artist', models.CharField(max_length=30)),
], ],
options={ options={
@ -89,39 +75,17 @@ class Migration(migrations.Migration):
bases=('pexp.project',), bases=('pexp.project',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='Model2B', name='NormalModelB',
fields=[ fields=[
('model2a_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.Model2A')), ('normalmodela_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.NormalModelA')),
('field2', models.CharField(max_length=10)), ('field2', models.CharField(max_length=10)),
], ],
options={ bases=('pexp.normalmodela',),
'abstract': False,
},
bases=('pexp.model2a',),
),
migrations.CreateModel(
name='ModelB',
fields=[
('modela_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.ModelA')),
('field2', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
bases=('pexp.modela',),
),
migrations.CreateModel(
name='nModelB',
fields=[
('nmodela_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.nModelA')),
('field2', models.CharField(max_length=10)),
],
bases=('pexp.nmodela',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='ResearchProject', name='ResearchProject',
fields=[ fields=[
('project_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.Project')), ('project_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.Project')),
('supervisor', models.CharField(max_length=30)), ('supervisor', models.CharField(max_length=30)),
], ],
options={ options={
@ -129,10 +93,21 @@ class Migration(migrations.Migration):
}, },
bases=('pexp.project',), bases=('pexp.project',),
), ),
migrations.CreateModel(
name='TestModelB',
fields=[
('testmodela_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.TestModelA')),
('field2', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
bases=('pexp.testmodela',),
),
migrations.CreateModel( migrations.CreateModel(
name='UUIDModelB', name='UUIDModelB',
fields=[ fields=[
('uuidmodela_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.UUIDModelA')), ('uuidmodela_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.UUIDModelA')),
('field2', models.CharField(max_length=10)), ('field2', models.CharField(max_length=10)),
], ],
options={ options={
@ -143,22 +118,17 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='uuidmodela', model_name='uuidmodela',
name='polymorphic_ctype', name='polymorphic_ctype',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_pexp.uuidmodela_set+', to='contenttypes.ContentType'), field=models.ForeignKey(related_name='polymorphic_pexp.uuidmodela_set+', editable=False, to='contenttypes.ContentType', null=True),
),
migrations.AddField(
model_name='testmodela',
name='polymorphic_ctype',
field=models.ForeignKey(related_name='polymorphic_pexp.testmodela_set+', editable=False, to='contenttypes.ContentType', null=True),
), ),
migrations.AddField( migrations.AddField(
model_name='project', model_name='project',
name='polymorphic_ctype', name='polymorphic_ctype',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_pexp.project_set+', to='contenttypes.ContentType'), field=models.ForeignKey(related_name='polymorphic_pexp.project_set+', editable=False, to='contenttypes.ContentType', null=True),
),
migrations.AddField(
model_name='modela',
name='polymorphic_ctype',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_pexp.modela_set+', to='contenttypes.ContentType'),
),
migrations.AddField(
model_name='model2a',
name='polymorphic_ctype',
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_pexp.model2a_set+', to='contenttypes.ContentType'),
), ),
migrations.CreateModel( migrations.CreateModel(
name='ProxyA', name='ProxyA',
@ -179,39 +149,29 @@ class Migration(migrations.Migration):
bases=('pexp.proxybase',), bases=('pexp.proxybase',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='Model2C', name='NormalModelC',
fields=[ fields=[
('model2b_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.Model2B')), ('normalmodelb_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.NormalModelB')),
('field3', models.CharField(max_length=10)), ('field3', models.CharField(max_length=10)),
], ],
bases=('pexp.normalmodelb',),
),
migrations.CreateModel(
name='TestModelC',
fields=[
('testmodelb_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.TestModelB')),
('field3', models.CharField(max_length=10)),
('field4', models.ManyToManyField(related_name='related_c', to='pexp.TestModelB')),
],
options={ options={
'abstract': False, 'abstract': False,
}, },
bases=('pexp.model2b',), bases=('pexp.testmodelb',),
),
migrations.CreateModel(
name='ModelC',
fields=[
('modelb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.ModelB')),
('field3', models.CharField(max_length=10)),
],
options={
'abstract': False,
},
bases=('pexp.modelb',),
),
migrations.CreateModel(
name='nModelC',
fields=[
('nmodelb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.nModelB')),
('field3', models.CharField(max_length=10)),
],
bases=('pexp.nmodelb',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='UUIDModelC', name='UUIDModelC',
fields=[ fields=[
('uuidmodelb_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='pexp.UUIDModelB')), ('uuidmodelb_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='pexp.UUIDModelB')),
('field3', models.CharField(max_length=10)), ('field3', models.CharField(max_length=10)),
], ],
options={ options={

View File

@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9b1 on 2015-10-24 01:42
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pexp', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='modelc',
name='field4',
field=models.ManyToManyField(related_name='related_c', to='pexp.ModelB'),
),
]

View File

@ -8,6 +8,7 @@ from polymorphic.showfields import ShowFieldContent, ShowFieldTypeAndContent
class Project(ShowFieldContent, PolymorphicModel): class Project(ShowFieldContent, PolymorphicModel):
"""Polymorphic model"""
topic = models.CharField(max_length=30) topic = models.CharField(max_length=30)
@ -19,42 +20,6 @@ class ResearchProject(Project):
supervisor = models.CharField(max_length=30) supervisor = models.CharField(max_length=30)
class ModelA(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10)
class ModelB(ModelA):
field2 = models.CharField(max_length=10)
class ModelC(ModelB):
field3 = models.CharField(max_length=10)
field4 = models.ManyToManyField(ModelB, related_name='related_c')
class nModelA(models.Model):
field1 = models.CharField(max_length=10)
class nModelB(nModelA):
field2 = models.CharField(max_length=10)
class nModelC(nModelB):
field3 = models.CharField(max_length=10)
class Model2A(PolymorphicModel):
field1 = models.CharField(max_length=10)
class Model2B(Model2A):
field2 = models.CharField(max_length=10)
class Model2C(Model2B):
field3 = models.CharField(max_length=10)
if django.VERSION < (1, 8): if django.VERSION < (1, 8):
from polymorphic.tools_for_tests import UUIDField from polymorphic.tools_for_tests import UUIDField
else: else:
@ -62,6 +27,7 @@ else:
class UUIDModelA(ShowFieldTypeAndContent, PolymorphicModel): class UUIDModelA(ShowFieldTypeAndContent, PolymorphicModel):
"""UUID as primary key example"""
uuid_primary_key = UUIDField(primary_key=True) uuid_primary_key = UUIDField(primary_key=True)
field1 = models.CharField(max_length=10) field1 = models.CharField(max_length=10)
@ -75,6 +41,7 @@ class UUIDModelC(UUIDModelB):
class ProxyBase(PolymorphicModel): class ProxyBase(PolymorphicModel):
"""Proxy model example - a single table with multiple types."""
title = models.CharField(max_length=200) title = models.CharField(max_length=200)
def __unicode__(self): def __unicode__(self):
@ -100,3 +67,31 @@ class ProxyB(ProxyBase):
def __unicode__(self): def __unicode__(self):
return u"<ProxyB: {0}>".format(self.title) return u"<ProxyB: {0}>".format(self.title)
# Internals for management command tests
class TestModelA(ShowFieldTypeAndContent, PolymorphicModel):
field1 = models.CharField(max_length=10)
class TestModelB(TestModelA):
field2 = models.CharField(max_length=10)
class TestModelC(TestModelB):
field3 = models.CharField(max_length=10)
field4 = models.ManyToManyField(TestModelB, related_name='related_c')
class NormalModelA(models.Model):
"""Normal Django inheritance, no polymorphic behavior"""
field1 = models.CharField(max_length=10)
class NormalModelB(NormalModelA):
field2 = models.CharField(max_length=10)
class NormalModelC(NormalModelB):
field3 = models.CharField(max_length=10)