2012-05-31 50 views
6

我有一个模型文件夹,这些文件夹中已有数据库中的几个模型。我刚刚添加了另一个文件/模型,但是当我运行syncdb时,它不会被添加到数据库中。我试过manage.py验证,它运行良好。我也运行了代码,它只在尝试使用“表不存在”进行保存时失败。Django模型在syncdb后没有显示在数据库中

原来的结构是这样的:
/型号
- __ 初始化 __的.py
- file1.py
- file2.py

__ init __ .py看起来像:

from file1 import File1Model 
from file2 import File2Model 

我加file3.py
/型号
- __ 初始化 __的.py
- file1.py
- file2.py
- file3.py

和改性__ 初始化 __的.py

from file1 import File1Model 
from file2 import File2Model 
from file3 import File3Model 

和file3的内容(名称可能已经改变,以保护无辜,但除此之外它的确切文件):
更新:刚刚尝试添加主键,因为ID字段可能已经与自动添加整数主键ID。也尝试了一些变化,但没有骰子。

from django.db import models 
from django.contrib.auth.models import User 


class File3Model(models.Model): 
    user = models.OneToOneField(User) 
    token = models.CharField(max_length=255, blank=False, null=False) 
    id = models.CharField(primary_key=True, max_length=255) 

    class Admin: 
     pass 

    class Meta: 
     app_label = 'coolabel' 

    def __unicode__(self): 
     return self.user.username 

    @staticmethod 
    def getinstance(user, token, id): 
     try: 
      instance = File3Model.objects.get(pk=id) 
      if instance.token != token: 
       instance.token = token 
       instance.save() 
      return instance 
     except: 
      pass 
     instance = File3Model() 
     instance.user = user 
     instance.token = token 
     instance.id = id 
     instance.save() 
     return instance 

因此,在这个例子中,File1Model和File2Model已经在DB和执行syncdb后留在DB。但是,即使在重新运行syncdb之后,也不会添加File3Model。有什么方法可以找出为什么新模型没有被添加?

+0

你试过'syncdb --all'吗? – sultan

+0

刚刚尝试过,但仍然无法正常工作。 – ntrrobng

回答

0

BOOM!

我对新模型使用了不同的app_label,但它必须在模型组中相同。

其他模型标签是“平庸标签”,我的新模型标签为“coolabel”。我将新模型的标签更改为“平庸标签”,现在它们正确地添加到数据库中。

感谢您的帮助,伙计!

9

如果您在models.py外定义模型,则必须在类Meta类上设置app_label属性。

编辑:app_label必须引用您的INSTALLED_APPS设置中的应用程序。它应该可以匹配模型目录所在的应用程序的名称,除非您有充分的理由不这样做。这似乎是你的问题。

class File3Model(models.Model): 
    foo = models.CharField(...) 
    ... 

    class Meta: 
     app_label = "my_app" 

请注意,syncdb将永远不会从数据库中删除任何表。其他表可能在用目录结构替换models.py之前使用syncdb创建。

+0

app_label字段在Meta类中设置,但它仍不会被添加到数据库中。 – ntrrobng

+0

'app_label'必须是您的'INSTALLED_APPS'设置中的应用程序。我已经添加了这个答案。 – Alasdair

0

为什么要拆分模型和模型文件夹,而不是将模型放置在models.py

在我自己的项目中,有大约10个模型住在models.py,我很好。您也可以尝试manage.py syncdb --all

我认为最好将所有模型保存在一个文件中,并像from my_app.models import model_name一样导入它们,而不是记住将必要模型导入models/__init__.py。顺便说一句,你避免了许多问题和长时间排队进口,并不在乎some_model居住在models/*.py文件中。

感谢,

苏丹

+0

感谢您的建议。但是,我正在使用现有的代码,并认为将所有内容都移回到models.py文件中是愚蠢的。我更愿意将所有内容都保存在模型目录中。 – ntrrobng

1

将app_label设置为我的应用程序解决了我的问题。

相关问题