当前位置:  开发笔记 > 编程语言 > 正文

Django模型 - 外键作为主键

如何解决《Django模型-外键作为主键》经验,为你挑选了1个好方法。

我有以下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.



1> Yonsy Solis..:

    如果您想要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)

    不,在创建Foo实例时不会创建FooExt的条目,您需要手动向Foo和FooExt添加条目.想想地方和餐馆,很多地方都可以是餐馆,但并不是所有地方都是餐馆.

    如果你喜欢在里面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()

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有