【问题标题】:makemigrations does not create the trough modelmakemigrations 不会创建低谷模型
【发布时间】: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


【解决方案1】:

您在模型的 Meta 类中提供auto_created = True,不建议这样做,也不建议这样做。 Here 是您可以在模型中提供的所有可能元选项的列表。

官方documentation说:

auto_created:指示字段是否自动创建的布尔标志,例如模型继承使用的 OneToOneField。

在 Meta 中给出这个会阻止 Django 自己创建这个模型。

【讨论】:

  • 我再次删除了数据库并进行了新的迁移,现在一切正常。非常感谢!
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 2021-04-06
  • 2018-11-29
  • 2021-07-07
  • 2021-10-11
  • 2014-11-19
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多