【问题标题】:Django test fails when creating test database创建测试数据库时Django测试失败
【发布时间】:2012-04-20 22:40:21
【问题描述】:

它失败了,并出现了一些与相关名称相关的问题。当然,在运行实际的开发服务器(使用./manage.py runserver)时,这不会发生,我猜模型可能会生成两次?我正在运行 psycopg2 2.4.1,这是我的测试输出:

(venv)lacrymology@Roller:boilerplate$ ./manage.py test
Creating test database for alias 'default'...
Error: One or more models did not validate:
l10n.address: Accessor for field 'user_shipping' clashes with related field 'User.shipping_address'. Add a related_name argument to the definition for 'user_shipping'.
l10n.address: Reverse query name for field 'user_shipping' clashes with related field 'User.shipping_address'. Add a related_name argument to the definition for 'user_shipping'.
l10n.address: Accessor for field 'user_billing' clashes with related field 'User.billing_address'. Add a related_name argument to the definition for 'user_billing'.
l10n.address: Reverse query name for field 'user_billing' clashes with related field 'User.billing_address'. Add a related_name argument to the definition for 'user_billing'.
custom_registration.profile: Accessor for field 'user' clashes with related field 'User.profile'. Add a related_name argument to the definition for 'user'.
custom_registration.profile: Reverse query name for field 'user' clashes with related field 'User.profile'. Add a related_name argument to the definition for 'user'.
addressmodel.address: Accessor for field 'user_shipping' clashes with related field 'User.shipping_address'. Add a related_name argument to the definition for 'user_shipping'.
addressmodel.address: Reverse query name for field 'user_shipping' clashes with related field 'User.shipping_address'. Add a related_name argument to the definition for 'user_shipping'.
addressmodel.address: Accessor for field 'user_billing' clashes with related field 'User.billing_address'. Add a related_name argument to the definition for 'user_billing'.
addressmodel.address: Reverse query name for field 'user_billing' clashes with related field 'User.billing_address'. Add a related_name argument to the definition for 'user_billing'.
profiles.profile: Accessor for field 'user' clashes with related field 'User.profile'. Add a related_name argument to the definition for 'user'.
profiles.profile: Reverse query name for field 'user' clashes with related field 'User.profile'. Add a related_name argument to the definition for 'user'.

【问题讨论】:

    标签: python django postgresql django-testing


    【解决方案1】:

    很有可能您的 test.py 导入了一个不在 INSTALLED_APP 内但有一些模型字段指向碰撞模型的应用程序。尝试在 test.py 中导入但不在 INSTALLED_APPS 中的应用中 grep user_shipping,并替换它。

    ./manage.py validate,将由./manage.py runserver 内部调用,仅检查从 INSTALLED_APP 内的应用程序加载的模型,因此运行 devserver 时没有错误。但是,test.py 中的导入会导致加载额外的未安装应用模型(如果有),然后会发生冲突。

    【讨论】:

    • 目前我还没有自己的测试,所以我应该弄清楚失败时正在运行哪些应用测试?
    • @Lacrymology 当然,您可以: 1. 查找您的模型中是否有任何 user_shipping related_name 并将其重命名; 2.使用pdb或signal检查碰撞模型,这里是User,在测试的早期阶段,在验证发生之前,检查哪个模型在User上定义了related_name user_shipping
    • hm.. 这似乎是 django-shop 的问题。它定义了一个默认的地址模型,但它建议您自己编写。然后它会在它的模型文件中发挥一些作用,因此您定义的模型或它自己的模型都可以从相同的名称访问。如果我从 INSTALLED_APPS 中删除“商店”,那么很多错误都会消失
    • @Lacrymology 是的,很有可能。我刚刚下载了django-shop,发现里面有user_billinguser_shipping,好像related_nameshipping_addressbilling_address没有在django-shop的其他代码中使用过。你可以改变它们。
    • 我去和 django-shop 的人谈谈
    【解决方案2】:

    这是 django-shop 测试的问题,如以下评论所述:Django test fails when creating test database

    如果不更改应用程序的代码,我就无法绕过它,所以我最终只是测试了我自己的应用程序(运行 ./manage.py test myapp 而不是 ./manage.py test

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2016-03-21
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      相关资源
      最近更新 更多