Django OneToOneField 可能有空白字段
Django OneToOneField with possible blank field
使用 Django 1.11 和 postgreSQL 数据库(刚从 sqlite 切换过来,之前没有这个问题)
所以我有 3 个模型:
models.py
class Person(models.Model):
is_parent = models.BooleanField()
class VideoGamePurchase(models.Model):
bought_by = models.ForeignKey(Person)
after_homework = models.OneToOneField(HomeWork, OPTIONS???)
class HomeWork(models.Model):
done_by = models.ForeignKey(Person)
content = models.CharField(blablaba)
所以我尝试实现的逻辑是,如果 Person.is_parent
是 True
,则可以为 after_homework
创建一个空字段或空字段的 VideoGamePurchase
实例.但是,如果 Person.is_parent
是 False
,我希望此字段成为唯一 HomeWork
对象的主键。
我找不到实现此目的的正确选项:
如果我没有 primary_key=True
那么 makemigrations 就会失败:
You are trying to add a non-nullable field 'id' to video_game_purchase without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
所以我想我必须 primary_key=True
。但似乎我不能 null=True
或 blank=True
.
有没有办法让 postgreSQL 的 OneToOneField
可选为空?
是否有 other/simpler 方法来实现这种逻辑?
感谢您的帮助!
如果您希望 after_homework
字段是可选的,那么您应该使用 null=True
和 blank=True
。
class VideoGamePurchase(models.Model):
bought_by = models.ForeignKey(Person)
after_homework = models.OneToOneField(HomeWork, null=True, blank=True)
您不希望 after_homework
使用 primary_key=True
- 这会使 after_homework
成为 VideoGamePurchase
模型的主键字段,这不会感知该字段是否可选。
您的迁移似乎一团糟,因为您之前为 after_homework
字段设置了 primary_key=True
。最简单的解决方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行 makemigrations
和 migrate
。这次,迁移将自动为 VideoGamePurchase
模型创建一个主键字段 id
。
使用 Django 1.11 和 postgreSQL 数据库(刚从 sqlite 切换过来,之前没有这个问题)
所以我有 3 个模型:
models.py
class Person(models.Model):
is_parent = models.BooleanField()
class VideoGamePurchase(models.Model):
bought_by = models.ForeignKey(Person)
after_homework = models.OneToOneField(HomeWork, OPTIONS???)
class HomeWork(models.Model):
done_by = models.ForeignKey(Person)
content = models.CharField(blablaba)
所以我尝试实现的逻辑是,如果 Person.is_parent
是 True
,则可以为 after_homework
创建一个空字段或空字段的 VideoGamePurchase
实例.但是,如果 Person.is_parent
是 False
,我希望此字段成为唯一 HomeWork
对象的主键。
我找不到实现此目的的正确选项:
如果我没有 primary_key=True
那么 makemigrations 就会失败:
You are trying to add a non-nullable field 'id' to video_game_purchase without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
所以我想我必须 primary_key=True
。但似乎我不能 null=True
或 blank=True
.
有没有办法让 postgreSQL 的 OneToOneField
可选为空?
是否有 other/simpler 方法来实现这种逻辑?
感谢您的帮助!
如果您希望 after_homework
字段是可选的,那么您应该使用 null=True
和 blank=True
。
class VideoGamePurchase(models.Model):
bought_by = models.ForeignKey(Person)
after_homework = models.OneToOneField(HomeWork, null=True, blank=True)
您不希望 after_homework
使用 primary_key=True
- 这会使 after_homework
成为 VideoGamePurchase
模型的主键字段,这不会感知该字段是否可选。
您的迁移似乎一团糟,因为您之前为 after_homework
字段设置了 primary_key=True
。最简单的解决方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行 makemigrations
和 migrate
。这次,迁移将自动为 VideoGamePurchase
模型创建一个主键字段 id
。