在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)
pk
和id
一般可以互换,因此,如果self.pk is None
也意味着self.id is None
。