我正在编写一个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.
关于我做错的任何线索?
最诚挚的问候,
答案 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)