gpt4 book ai didi

Django 1.9 - 操作错误 : no such table: products_category_artists; due to ManyToManyField?

转载 作者:行者123 更新时间:2023-12-03 10:09:49 26 4
gpt4 key购买 nike

我尝试用谷歌搜索这个问题,但我看到的答案大多来自 Django 版本,其中迁移需要 South 和/或 syncdb 仍然是一个问题。相关的匹配症状,但不匹配原因。

我从 Django 在执行 django-admin startproject project-namedjango-admin startapp products 时创建的默认项目/应用程序开始。

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist

# Create your models here.
class Artist(models.Model):
user = models.OneToOneField(User, null=True, blank=True)

name = models.CharField(max_length=50)

def __str__(self): return "<Artist: %s>"%self.name

class Category(models.Model):
artists = models.ManyToManyField(Artist)

name = models.CharField(max_length=50)
desc = models.CharField(max_length=200)

我的过程:

  • python manage.py flush 清空数据库
  • rm -rf products\migrations 删除之前的迁移
  • python manage.py 迁移

输出:

Operations to perform:
Apply all migrations: sessions, contenttypes, auth, admin
Running migrations:
No migrations to apply.
  • python manage.py makemigrations 产品

输出:

Migrations for 'products':
0001_initial.py:
- Create model Artist
- Create model Category
  • python manage.py 迁移

输出:

Operations to perform:
Apply all migrations: contenttypes, admin, sessions, products, auth
Running migrations:
No migrations to apply.

在这一点上,我很困惑。没有要应用的迁移,但是没有任何迁移吗?尽管如此,我还是继续前进。

  • python manage.py shell

在这个 shell 中,我输入了这些命令:

>>> from products.models import *
>>> artist = Artist(name="foo")
>>> artist.save()
>>> categ = Category(name="bar", desc="baz")
>>> categ.save()
>>> categ.artists.add(artist)

此时,我得到了一个巨大的错误回溯。问题似乎是这样的:

django.db.utils.OperationalError: no such table: products_category_artists

如果我尝试使用内置管理站点,我会看到同样的错误。

我的猜测是,问题是迁移并未实际被应用或特定表未被创建,但我不知道如何解决这些问题中的任何一个。

最佳答案

django 生成了一个名为 django_migrations 的表,它跟踪已应用的迁移。如果你删除你的迁移,重新生成它们并尝试迁移而不从表中删除记录,那么 django 会认为它已经应用了它们。你不应该删除你的迁移,它会导致 django 变得困惑。

如果您正在积极开发并想跳过整个迁移系统,您可以,但是一旦您开始使用迁移,就永远不要删除它们。这是我在开发新项目时使用的:

dropdb mydb && createdb mydb && python manage.py migrate --run-syncdb && python manage.py loaddata initial

首先,它会删除数据库和所有数据。然后它创建一个空的。 --run-syncdb 生成架构,loaddatafixtures file 加载数据.

因此,如果您仍在开发并且可以删除所有数据并将您关心的内容移动到固定文件,那么您可以删除所有迁移文件夹并在每次更改模型时运行上面的命令。

关于Django 1.9 - 操作错误 : no such table: products_category_artists; due to ManyToManyField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37397858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com