Django模型 - 外键作为主键

时间:2015-12-28 21:52:43

标签: sql django django-models

我有以下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,那就太棒了。

3 个答案:

答案 0 :(得分:7)

  1. 如果您想要OneToOne关系,请使用models.OneToOneField代替models.ForeignKey。使用外键,您需要在ForeignKey中添加unique=True
  2. 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. 如果您想在Foo内创建FooExt实例的自动添加功能,那么您可以重载创建和保存save内的Foo方法FooExt实例也是如此:

    3. 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)