Django OneToOneField可能为空的字段

19
使用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_parentTrue,则可以创建一个具有空或null字段after_homeworkVideoGamePurchase实例。然而,如果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

在postgreSQL中,有没有一种让OneToOneField可选为空的方法?

还有其他/更简单的实现这种逻辑的方法吗?

感谢您的帮助!

1个回答

30
如果你希望 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 - 这将使 VideoGamePurchase 模型中的 after_homework 成为主键字段,如果该字段是可选的,则没有意义。

看起来您的迁移出现了问题,因为您之前曾在 after_homework 字段上使用过 primary_key=True。最简单的解决方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行 makemigrationsmigrate。这一次,迁移将自动为 VideoGamePurchase 模型创建一个主键字段 id


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接