2010-06-26 60 views
2

我有我的擴展用戶配置文件的一些django模型。問題在於,當使用syncdb時,此代碼不會創建表(沒有任何反應,也沒有驗證錯誤)。爲什麼會發生? (還有那些機型給導入錯誤別處):模型不同時創建表

#!/usr/bin/env python 
# encoding: utf-8 
from django.db import models 
from django.contrib.auth.models import User 
from registration.signals import user_registered 
from forms import ExtendedRegistrationForm 
import hashlib 

class InheritedProfile(models.Model): 
    first_name = models.CharField("Name", max_length=50, blank=True, null=True) 
    last_name = models.CharField("Last name", max_length=50, blank=True, null=True) 
    pid = models.CharField("PESEL", max_length=11, blank=True, null=True) 
    street = models.CharField("Street", max_length=50, blank=True, null=True) 
    number = models.CharField("Flat/house number", max_length=10, blank=True, null=True) 
    code = models.CharField("Zip ", max_length=6, blank=True, null=True) 
    city = models.CharField("City", max_length=50, blank=True, null=True) 
    class Meta: 
     abstract=True 

class UserProfile(InheritedProfile): 
    def upload_path(self, field_attname): 
     filename = hashlib.md5(field_attname).hexdigest()[:4] + "_" + field_attname 
     return "uploads/users/%s" % (filename,) 

    user = models.ForeignKey(User, unique=True, related_name='profile') 
    image = models.ImageField(upload_to=upload_path, verbose_name="Image", blank=True, null=True) 

    class Meta: 
     ordering = ['-id'] 
     db_table = 'userprofile' 

    def __unicode__(self): 
     return u"%s " % self.user.username 

def user_created(sender, user, request, **kwargs): 
    form = ExtendedRegistrationForm(request.POST) 
    extended_user = UserProfile(user=user) 
    extended_user.is_active = False 
    extended_user.first_name = form.cleaned_data['first_name'] 
    extended_user.last_name = form.cleaned_data['last_name'] 
    extended_user.pid = form.cleaned_data['pid'] 
    extended_user.image = form.cleaned_data['image'] 
    extended_user.street = form.cleaned_data['street'] 
    extended_user.number = form.cleaned_data['number'] 
    extended_user.code = form.cleaned_data['code'] 
    extended_user.city = form.cleaned_data['city'] 
    extended_user.save() 

user_registered.connect(user_created) 

class Friend(InheritedProfile): 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 
    class Meta: 
     db_table = 'friend' 

在相反的代碼生成表完美:

#!/usr/bin/env python 
# encoding: utf-8 
from django.db import models 
from django.contrib.auth.models import User 
import hashlib 

class InheritedProfile(models.Model): 
    first_name = models.CharField("Name", max_length=50, blank=True, null=True) 
    last_name = models.CharField("Last name", max_length=50, blank=True, null=True) 
    pid = models.CharField("PESEL", max_length=11, blank=True, null=True) 
    street = models.CharField("Street", max_length=50, blank=True, null=True) 
    number = models.CharField("Flat/house number", max_length=10, blank=True, null=True) 
    code = models.CharField("Zip ", max_length=6, blank=True, null=True) 
    city = models.CharField("City", max_length=50, blank=True, null=True) 
    class Meta: 
     abstract=True 

class UserProfile(InheritedProfile): 
    def upload_path(self, field_attname): 
     filename = hashlib.md5(field_attname).hexdigest()[:4] + "_" + field_attname 
     return "uploads/users/%s" % (filename,) 

    user = models.ForeignKey(User, unique=True, related_name='profile') 
    image = models.ImageField(upload_to=upload_path, verbose_name="Image", blank=True, null=True) 

    class Meta: 
     ordering = ['-id'] 
     db_table = 'userprofile' 

    def __unicode__(self): 
     return u"%s " % self.user.username 

class Friend(InheritedProfile): 
    friend_of = models.ForeignKey(UserProfile, related_name='friend_of') 
    class Meta: 
     db_table = 'friend' 

我應該搬到這個user_created功能別的地方?信號不應該在這裏造成問題...

+0

是否可能在'forms'中輸入'models'或特定模型? – 2010-06-26 17:58:01

+0

我正在導入特定的模型。好吧,不知道爲什麼這個函數與爲模型創建表相衝突,但我已經將它移動到不同的文件。現在一切正常。 – crivateos 2010-06-26 18:23:35

回答

3

那麼你似乎有某種交叉導入;如果您導入某些型號到forms和某種形式從那裏回到models這不能解決,因爲當處理modelsforms需要導入,而forms需要models再次...這不能被解決!

除此之外,我認爲這是更好的設計,不需要在模型模塊中導入表單,因爲它們與視圖更相關!

+1

循環導入解決完美。它是模塊中的屬性查找,可能不是。 http://stackoverflow.com/questions/3082015/python-module-initialization-order/3082097#3082097 – 2010-06-26 23:13:36