118👍
Relying on Django’s built-in functionality and passing named parameters would be the simplest way to go.
p = User(name="Fred", email="fred@example.com")
But if you’re set on saving some keystrokes, I’d suggest adding a static convenience method to the class instead of messing with the initializer.
# In User class declaration
@classmethod
def create(cls, name, email):
return cls(name=name, email=email)
# Use it
p = User.create("Fred", "fred@example.com")
51👍
Django expects the signature of a model’s constructor to be (self, *args, **kwargs)
, or some reasonable facsimile. Your changing the signature to something completely incompatible has broken it.
- [Django]-Django migration fails with "__fake__.DoesNotExist: Permission matching query does not exist."
- [Django]-How to use Django ImageField, and why use it at all?
- [Django]-ImproperlyConfiguredError about app_name when using namespace in include()
26👍
The correct answer is to avoid overriding __init__
and write a classmethod as described in the Django docs.
But this could be done like you’re trying, you just need to add in *args, **kwargs
to be accepted by your __init__
, and pass them on to the super method call.
def __init__(self, name, email, house_id, password, *args, **kwargs):
super(models.Model, self).__init__(self, *args, **kwargs)
self.name = name
self.email = email
- [Django]-How to properly use the "choices" field option in Django
- [Django]-Django values_list vs values
- [Django]-What's the purpose of Django setting ‘SECRET_KEY’?
2👍
Don’t create models with args parameters. If you make a model like so:
User('name','email')
It becomes very unreadable very quickly as most models require more than that for initialization. You could very easily end up with:
User('Bert', 'Reynolds', 'me@bertreynolds.com','0123456789','5432106789',....)
Another problem here is that you don’t know whether ‘Bert’ is the first or the last name. The last two numbers could easily be a phone number and a system id. But without it being explicit you will more easily mix them up, or mix up the order if you are using identifiers. What’s more is that doing it order-based will put yet another constraint on other developers who use this method and won’t remember the arbitrary order of parameters.
You should prefer something like this instead:
User(
first_name='Bert',
last_name='Reynolds',
email='me@bertreynolds.com',
phone='0123456789',
system_id='5432106789',
)
If this is for tests or something like that, you can use a factory to quickly create models. The factory boy link may be useful: http://factoryboy.readthedocs.org/en/latest/
- [Django]-How to create a Django queryset filter comparing two date fields in the same model
- [Django]-In Django, how does one filter a QuerySet with dynamic field lookups?
- [Django]-Django model blank=False does not work?