0

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

这是我的已安装应用程序:

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.

关于我做错了什么的任何线索?

此致,

4

2 回答 2

2

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

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

假设我有两个模型,一个是myapp.reviews.Review,另一个是myapp.jobs.reviews.Review。如果myapp.reviews.Review在 myINSTALLED_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')
于 2014-05-28T23:42:37.377 回答
2
from paypal.standard.ipn.models import PayPalIPN

class SignupPaymentPayPal(models.Model):
    gettingstarted = models.ForeignKey('GettingStarted')
    paypalipn = models.ForeignKey(PayPalIPN)
于 2014-05-28T19:34:14.123 回答