2016-08-12 5 views
0

ユーザの作成時に新しいユーザに属する一連の "イベント"オブジェクトを作成したいとします。私がこれを行う方法は、DjangoのUserクラスsaveメソッドを上書きすることでした。私のEventクラスの場合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) 

、私は「MPTTと呼ばれるのDjangoパッケージを使用しました:

マイUserクラスは、オブジェクトのタイプを定義する3つの異なるオプションで、Djangoのユーザクラスの単なる延長であります":https://github.com/django-mptt/django-mptt/。これは、ツリー構造を実装する簡単な方法であるため、選択されました。モデルを以下に示します。エラーを修正する方法上の任意の考え

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

、または同じことを行う別の方法を考える:

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) 

は、このようにそれをやって、私は次のエラーを取得します?

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) 

しかし、私はadminサイトにこれを追加する方法がわからないよ:私はクラスに定期的なメソッドを追加したものと考えることの一つは、ツリーを言います。

答えて

0

私の推測では、Userオブジェクトが保存される前にコードが呼び出されていますか?

場合クラスMyUser実際に(あなたのコードでは、それはありません)あなたは、一般的に交換することができる。この

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のようになります保存DjangoのUserモデルを拡張しているので、またself.pk is Noneそれをもし手段は、self.id is Noneを意味する。

関連する問題