2010-06-26 62 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