Django模型 - 外键作为主键

use*_*688 2 sql django django-models

我有以下2个表

在models.py中

class Foo(models.Model):

    uuid = models.CharField(_('UUID'), primary_key=True, default=uuid4)
Run Code Online (Sandbox Code Playgroud)

class FooExt(models.Model):

    uuid = models.ForeignKey(Foo, verbose_name=_('UUID'), primary_key=True)
    time = models.DateTimeField(_('Create DateTime'), auto_now_add=True) 
Run Code Online (Sandbox Code Playgroud)

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

现在我添加一个条目Foo.是否FooExt自动创建了一个条目?或者我需要手动添加这两个条目FooFooExt

我有什么办法可以获得"自动"添加功能吗?从概念上讲,这两个表描述了同样的事情,但我只是不想污染Foo额外的信息.因此,如果添加Foo自动创建相应的,那就太棒了FooExt.

Yon*_*lis 7

  1. 如果您想要OneToOne关系,那么请使用models.OneToOneField而不是models.ForeignKey.使用外键你需要添加unique=True你的ForeignKey:
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)
Run Code Online (Sandbox Code Playgroud)
  1. 不,在创建Foo实例时不会创建FooExt的条目,您需要手动向Foo和FooExt添加条目.想想地方和餐馆,很多地方都可以是餐馆,但并不是所有地方都是餐馆.

  2. 如果你喜欢在里面Foo创建一个FooExt实例的自动添加功能,那么你可以重载创建和保存实例的save方法,如下所示:FooFooExt

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()
Run Code Online (Sandbox Code Playgroud)


mis*_*bah 1

看看 django-annoying 中的 AutoOneToOneField

https://github.com/skorokithakis/django-annoying

或者回答这个问题:Django可以自动创建相关的一对一模型吗?