【发布时间】:2019-10-30 22:08:58
【问题描述】:
我在我的项目中对我的一个模型进行了更改并进行了迁移,makemigrations 没有按预期工作。重建数据库只从我的 models.py 中创建了 3 个表中的 2 个,我无法找出问题所在。
有两个不同的应用程序; “博客”和“用户”。两者都在setting.py中注册。
我完全删除了数据库并删除了迁移文件夹。 然后我尝试了以下东西:
django makemigrations blog
django migrate blog
执行全局django makemigrations 没有任何效果,没有检测到任何变化。
这里是“blog”的相关models.py:
class Room(models.Model):
roomname = models.CharField(max_length=6, unique=True)
roomeditors=models.ManyToManyField(User,related_name='rooms_user_can_edit', blank=True)
displayadmin=models.ForeignKey(User,
related_name='room_user_is_displayadmin',null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.roomname
class Post(models.Model):
title = models.CharField(max_length=40)
content = models.TextField(max_length=300)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
rooms = models.ManyToManyField(Room, related_name='roomposts', through='Display')
def __str__(self):
return self.title
def get_absolute_url(self):
return "/post/{}/".format(self.pk)
class Display(models.Model):
class Meta:
auto_created = True
post = models.ForeignKey(Post, on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
isdisplayed = models.BooleanField(default=0)
def __str__(self):
return str(self.isdisplayed)
除了显示之外,每个表都会被创建。输出是:
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Room
- Create model Post
【问题讨论】:
-
你为什么在这里写
auto_created = True? -
@WillemVanOnsem 因为帖子可以写在多个房间中,但是对于每个帖子->房间连接,我想要一个布尔值“显示”。这就是我使用槽式模型的原因。我使用 ´´´ auto_created = True ´´´ 是因为我希望在创建新帖子时自动创建显示对象。在我尝试重新创建数据库之前,代码运行良好。
-
@WillemVanOnsem 当我注释掉 ``` 类元:auto_created = True `` 并尝试迁移时,我收到以下错误:``` ValueError:无法更改字段 blog.Post。房间到 blog.Post.rooms - 它们不是兼容的类型(您不能更改 M2M 字段或从 M2M 字段更改,或通过 = 在 M2M 字段上添加或删除)````
-
@Tankard666:也许您应该分两步完成:首先删除 m2m,然后添加一个新的(下一次迁移)。
标签: django django-models django-migrations