Django OneToOneField,可能有空白字段

2024-10-01 13:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

使用django1.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,那么可以为after_homework创建一个VideoGamePurchase实例,该实例的字段为空或为空。但是,如果Person.is_parentFalse,我希望这个字段成为唯一的HomeWork对象的主键。在

我找不到实现这一目标的正确选择:

如果我没有primary_key=True,则makemigrations失败:

^{pr2}$

所以我想我必须要primary_key=True。但我似乎不能拥有null=True或{}。在

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

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

谢谢你的帮助!在


Tags: 模型truebymodelismodelspostgresqlclass
1条回答
网友
1楼 · 发布于 2024-10-01 13:40:22

如果希望after_homework字段是可选的,那么应该使用null=True和{}。在

class VideoGamePurchase(models.Model):
    bought_by = models.ForeignKey(Person)
    after_homework = models.OneToOneField(HomeWork, null=True, blank=True)

您不希望primary_key=True用于after_homework-这会使after_homework成为{}模型的主键字段,如果该字段是可选的,那么这就没有意义了。在

看起来您的迁移被搞砸了,因为您之前已经为after_homework字段设置了primary_key=True。最简单的修复方法是从一个新的数据库开始,删除该应用程序的迁移,然后重新运行makemigrations和{}。这一次,迁移将自动为VideoGamePurchase模型创建一个主键字段id。在

相关问题 更多 >