Django - 具有复杂名称的另一个应用程序的外键

时间:2014-05-28 19:20:22

标签: django django-models django-paypal

我正在编写一个Django模型,该模型将链接到另一个应用模型。我知道我们应该将ForeginKeys与“nameoftheapp.nameofthemodel”联系起来,但我在这个用例中没有成功。

这是我的installed_apps:

INSTALLED_APPS = (
    ...
    'signup',  
    'paypal.standard.ipn',
    ... 
)

基本上我在应用程序“注册”中创建一个模型,我需要做一个外键来“paypal.standard.ipn”。

这是我的模特:

class SignupPaymentPayPal(models.Model):
    gettingstarted = models.ForeignKey('GettingStarted')
    paypalipn = models.ForeignKey('paypal.standard.ipn.PayPalIPN')

我需要链接的模型就是这个,https://github.com/spookylukey/django-paypal/blob/master/paypal/standard/ipn/models.py

当我尝试进行移民时,我得到了这个:

$ python manage.py schemamigration signup --auto

这是我得到的错误:

CommandError: One or more models did not validate:
signup.signuppaymentpaypal: 'paypalipn' has a relation with model paypal.standard.ipn.PayPalIPN, which has either not been installed or is abstract.

关于我做错的任何线索?

最诚挚的问候,

2 个答案:

答案 0 :(得分:2)

André解决方案有效,事实上我建议尽可能使用实际模型而不是字符串,以避免在字符串无法解析为模型时出现任何意外错误,但这里解释了为什么以前的方法不起作用:

Django有一个模型缓存,可以跟踪创建的所有Model子类。每个模型由appname和modelname唯一标识,但不是由完全限定的导入路径标识。

假设我有两个模型,一个是myapp.reviews.Review,另一个是myapp.jobs.reviews.Review。如果我的myapp.reviews.Review中首先INSTALLED_APPS,则这两个类实际上都是myapp.reviews.Review模型:

>>> from myapp.jobs.reviews import Review
>>> Review
<class 'myapp.reviews.Review'>

要使用字符串而不是类来指定ForeignKey(例如,为了避免循环导入),您需要遵循'<appname>.<modelname>'格式,即:

class SignupPaymentPayPal(models.Model):
    paypalipn = models.ForeignKey('ipn.PayPalIPN')

答案 1 :(得分:1)

from paypal.standard.ipn.models import PayPalIPN

class SignupPaymentPayPal(models.Model):
    gettingstarted = models.ForeignKey('GettingStarted')
    paypalipn = models.ForeignKey(PayPalIPN)