Jus*_*ing 4 python django postgresql one-to-one
使用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)
Run Code Online (Sandbox Code Playgroud)
所以我尝试实施的逻辑是,如果Person.is_parent是True一个VideoGamePurchase实例可以为空或空字段创建after_homework。但是,如果Person.is_parent是False,我希望该字段成为唯一HomeWork对象的主键。
我找不到实现此目的的正确选项:
如果我没有,primary_key=True则迁移失败:
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
Run Code Online (Sandbox Code Playgroud)
所以我想我有primary_key=True。但是似乎我不能拥有null=True或拥有blank=True。
有没有一种方法可以使OneToOneFieldpostgreSQL 为空?
还有其他/更简单的方法来实现这种逻辑吗?
谢谢你的帮助!
Ala*_*air 10
如果您希望该after_homework字段为可选字段,则应使用null=True和blank=True。
class VideoGamePurchase(models.Model):
bought_by = models.ForeignKey(Person)
after_homework = models.OneToOneField(HomeWork, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
你不想要primary_key=True的after_homework-这将使after_homework该主键字段VideoGamePurchase模式,这没有任何意义,如果该字段是可选的。
看来您的迁移工作搞砸了,因为您之前曾primary_key=True参加过该after_homework领域。最简单的解决方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行makemigrations和migrate。这次,迁移将自动id为VideoGamePurchase模型创建一个主键字段。
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |