gpt4 book ai didi

python - Django OneToOneField 可能有空白字段

转载 作者:行者123 更新时间:2023-11-29 11:31:00 33 4
gpt4 key购买 nike

使用 Django 1.11 和 postgreSQL 数据库(刚从 sqlite 切换过来,之前没有这个问题)

所以我有 3 个模型:

模型.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_parentTrue,则可以创建一个空的 VideoGamePurchase 实例或 after_homework 的空字段。但是,如果 Person.is_parentFalse,我希望此字段成为唯一的 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=Trueblank=True

有没有办法让 OneToOneField 在 postgreSQL 中可选地为空?

是否有其他/更简单的方法来实现这种逻辑?

感谢您的帮助!

最佳答案

如果您希望 after_homework 字段是可选的,那么您应该使用 null=Trueblank=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。最简单的解决方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行 makemigrationsmigrate。这次,迁移将自动为 VideoGamePurchase 模型创建一个主键字段 id

关于python - Django OneToOneField 可能有空白字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47804020/

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