我有以下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
,那就太棒了。
答案 0 :(得分:7)
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添加条目。在地方和餐馆里想想,很多地方都可以是餐馆,但并不是所有地方都是餐馆。
如果您想在Foo
内创建FooExt
实例的自动添加功能,那么您可以重载创建和保存save
内的Foo
方法FooExt
实例也是如此:
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()
答案 1 :(得分:2)
看起来Yonsy Solis在保存方法中有错误(已更正),试试这个:
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()
评论:我还不能评论,所以我决定创建答案
答案 2 :(得分:1)
在django-annoying中查看AutoOneToOneField
https://github.com/skorokithakis/django-annoying
或回答此问题:Can Django automatically create a related one-to-one model?