Django 模型 - 外键作为主键
Posted
技术标签:
【中文标题】Django 模型 - 外键作为主键【英文标题】:Django model - Foreign Key as Primary Key 【发布时间】:2016-04-02 18:18:24 【问题描述】:我有以下 2 个表
在models.py中
class Foo(models.Model):
uuid = models.CharField(_('UUID'), primary_key=True, default=uuid4)
和
class FooExt(models.Model):
uuid = models.ForeignKey(Foo, verbose_name=_('UUID'), primary_key=True)
time = models.DateTimeField(_('Create DateTime'), auto_now_add=True)
基本上,我有Foo
和FooExt
。我想要FooExt
之间的一对一关系。这就是为什么我将FooExt
的主键设置为Foo
的外键(不确定这是否正确)。
现在我在Foo
中添加一个条目。 FooExt
的条目是否会自动创建?还是我需要手动向Foo
和FooExt
添加一个条目?
我可以做些什么来获得“自动”添加功能?从概念上讲,这两张表描述的是同一件事,但我只是不想用额外的信息污染Foo
。因此,如果添加到Foo
会自动创建相应的FooExt
,那就太好了。
【问题讨论】:
好吧,您可以在它们之间使用OneToOneField
,但是不会自动创建任何内容,您需要手动创建。如果所有FooExt
信息都属于Foo
,那么您不应该真正分离这些字段。它不会使您的模型“被污染”,并且您可以避免像 foo.fooext.time
这样的查找,这是非常不必要的。
【参考方案1】:
看起来 Yonsy Solis 在保存方法中的回答有误(已更正),试试这个:
类 Foo(models.Model): …… …… def 保存(自我,*args,**kwargs): super(Foo, self).save(*args, **kwargs) foo_ext = FooExt() foo_ext.uuid = 自我 foo_ext.save()
备注:我还不能评论,所以我决定创建答案
【讨论】:
是的,它对我有用。谢谢。只是为了玩鬼子,这种方法有什么缺点? 在做foo_ext = FooExt()
之前你不应该检查一下这个FooExt
是否已经存在吗?因为就目前而言,如果有人创建 Foo
,然后对其进行更新,则对 save()
的第二次调用将用新实例覆盖 FooExt
是的,没错,您可以执行检查:如果Foo
已经创建,那么您不会创建任何新的FooExt
,您可以在保存方法中使用if self.pk:
来执行此操作,此@987654321 @ 可能会有所帮助。【参考方案2】:
-
如果您需要 OneToOne 关系,请使用
models.OneToOneField
而不是 models.ForeignKey
。使用外键,您需要在 ForeignKey 中添加 unique=True
:
class Foo(models.Model): uuid = models.CharField(_('UUID'), primary_key=True, default=uuid4) class FooExt(models.Model): uuid = models.OneToOneField(Foo, verbose_name=_('UUID'), primary_key=True) time = models.DateTimeField(_('Create DateTime'), auto_now_add=True)
不,当您创建 Foo 实例时,不会创建 FooExt 的条目,您需要手动将条目添加到 Foo 和 FooExt。想想地方和餐馆,很多地方都可以是餐馆,但并不是所有的地方都是餐馆。
1234563这个:class Foo(models.Model): .... .... def save(self, *args, **kwargs): super(Foo, self).save(*args, **kwargs) foo_ext = FooExt() foo_ext.uuid = self foo_ext.save()
【讨论】:
我不确定你在#3 中的意思。我实现了它,它给了我一个无限递归,因为我一遍又一遍地调用 self.save()Foo
。
在#3中,我是说为保存模型和创建并保存@987654332的方法重载保存方法(模型中用于将内容保存在数据库中的方法) @模特也是。在代码中更正了,foo_ext.uuid
不仅是foo_ext
【参考方案3】:
看看 django-annoying 中的 AutoOneToOneField
https://github.com/skorokithakis/django-annoying
或回答这个问题:Can Django automatically create a related one-to-one model?
【讨论】:
以上是关于Django 模型 - 外键作为主键的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQLWorkbench EER 模型 (ERD) 转到 Django?
django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段