在Django中为新用户创建单独对象

问题描述:

我想在创建所述用户时创建一组属于新用户的“事件”对象。我想这样做的方式是覆盖Django的User类保存方法。在Django中为新用户创建单独对象

我的用户类只是Django的用户类的一个扩展,与定义对象的类型,有三种不同的选项:

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import User, Group 
from events.models import Event 

class MyUser(models.Model): 
    user = models.OneToOneField(User, related_name='myuser', on_delete=models.CASCADE) 
    userID = models.CharField(max_length=30) 
    isA = models.BooleanField(default=False) 
    isB = models.BooleanField(default=False) 
    isC = models.BooleanField(default=False) 

    def save(self, *args, **kwargs): 
     if self.pk is None and self.isA: 
      event = Event.objects.create(name="Event", rank="A", owner=self.user) 
      subEvent = Event.objects.create(name="Sub Event", rank="AA", owner=self.user, parent=event) 

对于我的事件类,我已经使用了Django的包叫做“MPTT “:https://github.com/django-mptt/django-mptt/。这被选中了,因为它是实现树结构的一种简单方法。该模型如下图所示:

from __future__ import unicode_literals 
from django.contrib.auth.models import User 
from django.db import models 
from mptt.models import MPTTModel, TreeForeignKey 

class Event(MPTTModel): 
    name = models.CharField(max_length=30) 
    rank = models.CharField(max_length=10, null=True) 
    owner = models.ForeignKey(User, null=True, related_name='event', on_delete=models.CASCADE) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True) 


    class MPTTMeta: 
     order_indertion_by = ['rank'] 

    def __unicode__(self): 
     return u'%s' % (self.name) 

这样做,这样,我得到以下错误:

ProgrammingError: column "owner_id" of relation "events_event" does not exist 
LINE 1: INSERT INTO "events_event" ("name", "rank", "owner_id", "par... 

如何修正这个错误,或者想别的办法做同样的事情有什么想法?有一两件事我想的是,添加一个普通的方法到类树说:

def tree(self): 
    if self.pk is None and self.isA: 
     event = Event.objects.create(name="Event", rank="A", owner=self.user) 
     subEvent = Event.objects.create(name="Sub Event", rank="AA", owner=self.user, parent=event) 

但我不确定我会如何将其添加到管理员站点。

我的猜测是你的代码在用户对象被保存之前被调用。

如果类MyUser实际上是延长了Django的用户模型(在你的代码是不是),你保存应该是这个样子

def save(self, *args, **kwargs): 
    is_create = self.pk is None 
    user = super(MyUser, self).save(*args, **kwargs) 
    if is_create and self.isA: 
     event = Event.objects.create(name="Event", rank="A", owner=user) 
     subEvent = Event.objects.create(name="Sub Event", rank="AA", owner=user, parent=event) 

pkid一般可以互换,因此,如果self.pk is None也意味着self.id is None