Reputation: 36205
I'm working with django 1.6 and postgresql. I have multiple models with similar fields that look like:
class MU2(models.Model):
name = models.CharField(max_length=200,default="",unique=True)
addresses = models.CharField(max_length=200,default="")
email = models.CharField(max_length=200,default="")
......
Is it possible to pass a model name in as a parameter? in pseudocode I would like to
def savePractices(practices, MODELNAME):
from ml1.models import MODELNAME
for practice in practices:
p =MODELNAME(**practice)
try:
p.save()
except IntegrityError:
print "error"
return
Upvotes: 2
Views: 2090
Reputation: 4294
You can even do as following:
def savePractices(practices, MODELNAME):
from ml1 import models
dynamic_model = getattr(models, MODELNAME)
for practice in practices:
p = dynamic_model(**practice)
try:
p.save()
except IntegrityError:
print "error"
return
Upvotes: 1
Reputation: 1023
May be better to do this:
class ModelMix(object):
@classmethod
def savePractices(cls, practices):
for practice in practices:
p = cls(**practice)
try:
p.save()
except IntegrityError:
print "error"
return
class MU1(models.Model, ModelMix):
name = models.CharField(max_length=200,default="",unique=True)
addresses = models.CharField(max_length=200,default="")
email = models.CharField(max_length=200,default="")
class MU2(models.Model, ModelMix):
name = models.CharField(max_length=200,default="",unique=True)
addresses = models.CharField(max_length=200,default="")
email = models.CharField(max_length=200,default="")
MU1.savePractices(practices)
MU2.savePractices(practices)
Upvotes: 2
Reputation: 3177
get_model
in django.db.models.loading
module is what you're looking for:
from django.db.models.loading import get_model
def savePractices(practices, model_name):
model = get_model('YOUR_APP_NAME', model_name)
(...)
Upvotes: 3