0

I want to change the strings as variables. I have 7 models in Django.

class Level1:
   level1_id = models.IntegerField()
   level1_name = models.CharField()

class Level2:
   level2_id = models.IntegerField()
   level2_name = models.CharField()

class Level3:
   level3_id = models.IntegerField()
   level3_name = models.CharField()

class Level4:
   level4_id = models.IntegerField()
   level4_name = models.CharField()

class Level5:
   level5_id = models.IntegerField()
   level5_name = models.CharField()

class Level6:
   level6_id = models.IntegerField()
   level6_name = models.CharField()

class Level7:
   level7_id = models.IntegerField()
   level1_name = models.CharField()

I'm passing an integer 'level_id' in the range of 1-7 and 'name' via an AJAX request. Now in my views.py.

level_id = request.POST['level_id']
name = request.POST['name']

if level_id == 1:
    level_name = Level1.objects.all(level1_name = name)


if level_id == 2:
    level_name = Level2.objects.all(level2_name = name)


if level_id == 3:
    level_name = Level3.objects.all(level3_name = name)


if level_id == 4:
    level_name = Level4.objects.all(level4_name = name)


if level_id == 5:
    level_name = Level5.objects.all(level5_name = name)


if level_id == 6:
    level_name = Level6.objects.all(level6_name = name)


if level_id == 7:
    level_name = Level7.objects.all(level7_name = name)

Can I reduce all if's to make it more generc. Something like

dict = {"1":"Level1","2":"Level2","3":"Level3","4":"Level4","5":"Level5","6":"Level6","7":"Level7"}

level_name = dict[level_id].objects.all( dict[level_id]+"id" = name)
1
  • 2
    You rather reconsider your models. It seems that you can achieve same functionality using a single model. Commented Nov 3, 2013 at 17:56

1 Answer 1

2

You can use django get_model to your advantage here:

from django.db.models.loading import get_model

level_id = request.POST['level_id']
name = request.POST['name']
model = get_model('app_name', 'Level%s' % level_id) #replace app_name with the app this model resides in.

params = {"level%s_name" % level_id: name}
level_name = model.objects.filter(**params)

I am not sure why you have

class Level1():
    level1_name = CharField()

You can just make it

class Level1():
    level_name = CharField()

That way you know which level it refers to.

Even better

class Level()
    level_name = CharField()
    level_id = IntegerField()

and get rid of Level1, Level2, ... This is more extendable

Sign up to request clarification or add additional context in comments.

1 Comment

Does this app_name refers to the app in which my models.py is kept?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.