user1592380
user1592380

Reputation: 36205

Can you pass a model as a parameter for a view function in django?

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

Answers (4)

se7entyse7en
se7entyse7en

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

sheh
sheh

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

pchiquet
pchiquet

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

Neel
Neel

Reputation: 21243

You can use __import__ or importlib to load module dynamically.

It will load module from modulename.

Upvotes: 1

Related Questions