【问题标题】:Django makemigrations 1.8.18 ValueError: Lookup failed for model referenced by fieldDjango makemigrations 1.8.18 ValueError:查找字段引用的模型失败
【发布时间】:2017-10-30 05:10:03
【问题描述】:

最近将 Django 从 1.7 升级到 1.8。将 PRD DB 转储到 DEV 中。不要关心 DB for dev 中的任何迁移,所以:

  1. 删除我的应用程序中的迁移文件夹。
  2. 从 django_migrations 表中删除所有行。

好的,一切顺利。现在,我只想为应用程序做一个假迁移,然后我们就走了。所以我从顶级应用“网站”开始。

运行这个:

python manage.py makemigrations website

给出文件:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
]

operations = [
    migrations.CreateModel(
        name='HistoricalStock',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('period_date', models.DateField()),
            ('close', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('open', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day_high', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day_low', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('change', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('average_gain', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('average_loss', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('rsi', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('true_range', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('average_true_range', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('price_average_true_range', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('thirty_day_constant_maturity_vol_skew', models.DecimalField(default=0.0, null=True, max_digits=20, decimal_places=10, blank=True)),
        ],
        options={
            'ordering': ['period_date'],
        },
    ),
    migrations.CreateModel(
        name='Industry',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('group', models.CharField(unique=True, max_length=40, verbose_name=b'name')),
            ('slug', models.SlugField(unique=True)),
        ],
    ),
    migrations.CreateModel(
        name='Sector',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('group', models.CharField(unique=True, max_length=40, verbose_name=b'name')),
            ('slug', models.SlugField(unique=True)),
        ],
    ),
    migrations.CreateModel(
        name='Stock',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('ticker', models.CharField(max_length=20)),
            ('profile', models.TextField()),
            ('name', models.CharField(max_length=40)),
            ('broker_rating', models.DecimalField(default=0.0, null=True, max_digits=10, decimal_places=2, blank=True)),
            ('ranking_industry', models.CharField(max_length=40, null=True, blank=True)),
            ('ranking_industry_upper_percent', models.DecimalField(null=True, max_digits=20, decimal_places=10, blank=True)),
            ('country', models.CharField(max_length=40, null=True, blank=True)),
            ('has_options', models.BooleanField(default=False)),
            ('current_stock_price', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('change', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('change_percent', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('open', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day_high', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day_low', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('ex_div_date', models.DateField(null=True, blank=True)),
            ('pay_div_date', models.DateField(null=True, blank=True)),
            ('earnings_date', models.DateField(null=True, blank=True)),
            ('vol', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('pe', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('mkt_cap', models.DecimalField(default=0, max_digits=40, decimal_places=0)),
            ('div_yield', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('div_amount', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('year_high', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('year_low', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day180pc', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('day360pc', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('instpct', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('insidepct', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('earnings_share', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('fifty_ma', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('two_hundred_ma', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('std_dev', models.DecimalField(default=0.0, max_digits=20, decimal_places=10)),
            ('stats_period', models.IntegerField(default=0)),
            ('last_refreshed', models.DateTimeField(null=True, editable=False, blank=True)),
            ('industry', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='website.Industry', null=True)),
            ('sector', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='website.Sector', null=True)),
        ],
    ),
    migrations.AddField(
        model_name='industry',
        name='sector',
        field=models.ForeignKey(to='website.Sector'),
    ),
    migrations.AddField(
        model_name='historicalstock',
        name='stock',
        field=models.ForeignKey(to='website.Stock'),
    ),
    migrations.AlterUniqueTogether(
        name='historicalstock',
        unique_together=set([('stock', 'period_date')]),
    ),
]

看起来不错,4 个模型,在同一个文件中有几个 FK 模型。

然后,运行假的:

python manage.py migrate website --fake

疯了:

ValueError: Lookup failed for model referenced by field keyedcache.Stock.sector: website.Sector

是说app keyedcache 没有找到对模型Sector 的引用? keyedcache 与它有什么关系?

Keyedcache 是我安装的一个应用程序。

如果我跑:

python manage.py migrate keyedcache --fake

它没有说明要迁移。

你会转圈圈。

我已经在 Django 1.7 中完成了数百次,完全没有问题。导致此问题的 1.8 版本发生了一些变化。

怎么了?

【问题讨论】:

    标签: python django


    【解决方案1】:

    这是一条充满陷阱的道路,许多其他人在您之前已经走过。首先要做的是再次清理您的迁移。然后清除所有陈旧的.pyc 文件。这一步非常重要。

    之后你需要做的事情

    ./manage.py makemigrations myapp
    

    适用于您的所有应用。那么你只应该运行

    ./manage.py migrate --fake
    

    【讨论】:

    • 它奏效了——很奇怪。我删除了 .pyc 文件并重新开始,一切都运行了。不知道!
    • 很高兴它被整理出来了。祝您的项目一切顺利
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2016-05-10
    • 1970-01-01
    • 2017-11-20
    • 2017-08-07
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多