Hoihoi
Aangeizen ik nog steeds bezig ben met me de quirks van Django eigen te maken loop ik weer tegen een probleem op.
Case:
ik heb een django webapp gebouwd om users op een Jabber-server te managen. Prima, hierbij gebruik ik de bekende tango with django tutorial (http://www.tangowithdjang...setting-up-authentication) die ik modificeer.
Je ziet dat men daar een UserProfile klasse aanmaakt, die inherit van User. Dit omdat er dan een paar extra fields bij kunnen zonder dingen met de User klasse te tweaken.
Ik wil datzelfde ook doen:
Goed, so far so good... maar ik wil mijn jabberadmins populaten vanuit een scriptje. Waarom? Omdat diverse objecten in de database een "created_by" foreign key hebben naar een JabberAdmin.
Dat betekent dus dat ik JabberAdmin objecten moet instantieren die overerven van de User objecten.
Mijn oude code:
Nou prima, dat werkte gewoon goed.
Nu ik echter de link heb gelegd met de Django User klasse:
Okay prima, ik moet een user_id opgeven dus... maar hoezo dat? Als in: waarom zou ik dat willen... het veld is namelijk in de database auto incrementing:
Waarom moet dit?
En kan ik hier omheen komen? Ik kan best wat user_id's opgeven (zou even moeten kijken hoe de constructor van mijn JabberAdmin er dan uit komt te zien) maar eigenlijk wil ik dat gewoon niet (dat moet de DB maar lekker uitzoeken...)
Aangeizen ik nog steeds bezig ben met me de quirks van Django eigen te maken loop ik weer tegen een probleem op.
Case:
ik heb een django webapp gebouwd om users op een Jabber-server te managen. Prima, hierbij gebruik ik de bekende tango with django tutorial (http://www.tangowithdjang...setting-up-authentication) die ik modificeer.
Je ziet dat men daar een UserProfile klasse aanmaakt, die inherit van User. Dit omdat er dan een paar extra fields bij kunnen zonder dingen met de User klasse te tweaken.
Ik wil datzelfde ook doen:
Python:
1
2
3
4
5
6
| class JabberAdmin(models.Model): # This line is required. Links UserProfile to a User model instance. user = models.OneToOneField(User) name = models.CharField(max_length=128, unique=True, primary_key=True) group = models.ForeignKey(JabberAdminGroup) |
Goed, so far so good... maar ik wil mijn jabberadmins populaten vanuit een scriptje. Waarom? Omdat diverse objecten in de database een "created_by" foreign key hebben naar een JabberAdmin.
Dat betekent dus dat ik JabberAdmin objecten moet instantieren die overerven van de User objecten.
Mijn oude code:
code:
1
2
3
4
5
| admin_boudewijn = add_JabberAdmin(name="boudewijn", group=admingroup_team1)
def add_JabberAdmin(name,group):
obj = JabberAdmin.objects.get_or_create(name=name,group=group)[0]
return obj |
Nou prima, dat werkte gewoon goed.
Nu ik echter de link heb gelegd met de Django User klasse:
code:
1
2
3
4
5
6
7
8
9
10
11
| Traceback (most recent call last):
File "/home/john/workspace/jabberadmin_project/jabberadmin_project/populate.py", line 108, in <module>
populate()
File "/home/john/workspace/jabberadmin_project/jabberadmin_project/populate.py", line 12, in populate
admin_boudewijn = add_JabberAdmin(name="boudewijn", group=admingroup_team)
File "/home/john/workspace/jabberadmin_project/jabberadmin_project/populate.py", line 84, in add_JabberAdmin
obj = JabberAdmin.objects.get_or_create(name=name,group=group)[0]
*KNIP*
File "/usr/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py", line 450, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: jabberadmin_jabberadmin.user_id |
Okay prima, ik moet een user_id opgeven dus... maar hoezo dat? Als in: waarom zou ik dat willen... het veld is namelijk in de database auto incrementing:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| mysql> describe auth_user; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | password | varchar(128) | NO | | NULL | | | last_login | datetime | NO | | NULL | | | is_superuser | tinyint(1) | NO | | NULL | | | username | varchar(30) | NO | UNI | NULL | | | first_name | varchar(30) | NO | | NULL | | | last_name | varchar(30) | NO | | NULL | | | email | varchar(75) | NO | | NULL | | | is_staff | tinyint(1) | NO | | NULL | | | is_active | tinyint(1) | NO | | NULL | | | date_joined | datetime | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 11 rows in set (0.00 sec) |
Waarom moet dit?
En kan ik hier omheen komen? Ik kan best wat user_id's opgeven (zou even moeten kijken hoe de constructor van mijn JabberAdmin er dan uit komt te zien) maar eigenlijk wil ik dat gewoon niet (dat moet de DB maar lekker uitzoeken...)