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) 

基本上,我有FooFooExt。我想要FooExt 之间的一对一关系。这就是为什么我将FooExt 的主键设置为Foo 的外键(不确定这是否正确)。

现在我在Foo 中添加一个条目。 FooExt 的条目是否会自动创建?还是我需要手动向FooFooExt 添加一个条目?

我可以做些什么来获得“自动”添加功能?从概念上讲,这两张表描述的是同一件事,但我只是不想用额外的信息污染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中加入非主键和外键列的查询

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

Django 啥时候查找外键的主键?

Django:如何在手动表单字段中显示模型的外键对象作为选择

Django - 多文件上传数据未插入模型数据库