在Django中使用OneToOneField

时间:2014-11-29 19:51:50

标签: python django python-2.7

我在应用程序中实现了一些模型:

from django.db import models

class Commentary(models.Model):
    user_id = models.ForeignKey(User)
    created_date = models.DateField()
    comment = models.TextField()

class Role(models.Model):
    role_name = models.CharField(max_length=25)

class User(models.Model):
    login = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    address = models.CharField(max_length=255)
    phone = models.CharField(max_length=25)
    postcode = models.CharField(max_length=25)
    email = models.EmailField()
    role_id = models.OneToOneField(Role)

之后键入的控制台“python manage.py makemigration mainws”用于在我的数据库中进行迁移,然而,采用了堆栈跟踪错误。如果查看django documentation for one-to-one example,我们可以看到与他的相似性,但没有选项primary_key=True。如何解决此问题或使用ForeignKey unique=True解决此问题或其他问题?

堆栈跟踪:

=> python manage.py makemigration mainws
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/local/Cellar/python/2.7.8_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/savicvalera/code/lab8/website/mainws/models/__init__.py", line 1, in <module>
    from . import Commentary, MailList, Product, Provider, Rate, Review, Role, Sale, ShoppingCart, Status, Supplies, User
  File "/Users/savicvalera/code/lab8/website/mainws/models/Commentary.py", line 11, in <module>
    from . import Product, User
  File "/Users/savicvalera/code/lab8/website/mainws/models/User.py", line 14, in <module>
    class User(models.Model):
  File "/Users/savicvalera/code/lab8/website/mainws/models/User.py", line 21, in User
    role_id = models.OneToOneField(Role,to_field='id')
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1799, in __init__
    super(OneToOneField, self).__init__(to, to_field, OneToOneRel, **kwargs)
  File "/Users/savicvalera/code/lab8/lib/python2.7/site-packages/django/db/models/fields/related.py", line 1612, in __init__
    assert isinstance(to, six.string_types), "%s(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
AssertionError: OneToOneField(<module 'mainws.models.Role' from '/Users/savicvalera/code/lab8/website/mainws/models/Role.pyc'>) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string u'self'

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的代码组织,则问题出在您的导入中。当你说

from . import Role

您正在将Role.py导入名为Role的模块对象中。在那个模块里面(我假设)是你的Role模型类。所以你真正想要的是:

from .Role import Role

或者:

from . import Role

...
role_id = models.OneToOneField(Role.Role)

答案 1 :(得分:0)

您应该在元类中定义app_label

class Foo(models.Model):
    class Meta:
        app_label = 'mainws'