【问题标题】:Django model - Foreign Key as Primary KeyDjango 模型 - 外键作为主键
【发布时间】: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 这样的查找,这是非常不必要的。

标签: sql django django-models


【解决方案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】:
  1. 如果您需要 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)
  1. 不,当您创建 Foo 实例时,不会创建 FooExt 的条目,您需要手动将条目添加到 Foo 和 FooExt。想想地方和餐馆,很多地方都可以是餐馆,但并不是所有的地方都是餐馆。

  2. 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2018-01-10
    • 2013-05-27
    • 2012-02-15
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多