Django模型继承创建或从父级获取
我正在尝试构建一个项目,似乎对我的需求使用模型继承可以发挥最好的作用,我有一个基本模型,其中我有几个模型使用它进行继承。在基本模型中,我有一个slug字段,它在所有方面都是唯一的(为了完整性) 在我的子模型中,有时我想创建一个记录,但如果父项已经存在,我只想创建子项并直接链接到父项。比如说,Django模型继承创建或从父级获取,django,Django,我正在尝试构建一个项目,似乎对我的需求使用模型继承可以发挥最好的作用,我有一个基本模型,其中我有几个模型使用它进行继承。在基本模型中,我有一个slug字段,它在所有方面都是唯一的(为了完整性) 在我的子模型中,有时我想创建一个记录,但如果父项已经存在,我只想创建子项并直接链接到父项。比如说, class Base(models.Model): slug = models.SlugField(_('Slug'), unique=True) #Other fiels class Chi
class Base(models.Model):
slug = models.SlugField(_('Slug'), unique=True)
#Other fiels
class ChildA(Base):
height = models.CharField(max_length=100, )
class ChildB(Base):
is_for_sale = models.BooleanField(_('Is active'), default=True, )
# when creating ChildA, it will automtically insert into base model as well
ChildA.objects.create(slug='bmw', height='11')
# now for childB, I want the newly created object to link to an existing record in Base where slug
# is the unique value, is it possible todo such a thing?
ChildB.objects.create(slug='bmw', is_for_sale=True)
我想你可能在这一点上误解了继承 如果我没弄错的话,你说那个鼻涕虫一定是独一无二的。因此,您将具有特定slug的类的数量限制为“1” 您的类
ChildB
和ChildA
未“链接”到BaseClass
,而是BaseClass的后代,因此子类的实例也是BaseClass
的实例
在我看来,你似乎在寻找一个Slug对象和多个其他具有不同属性的对象之间的关系
我建议使用如下关系,而不是从类基类派生:
class ChildA(models.Model):
height = models.CharField(max_length=100, )
slug = ForeignKey(Base)
这将确保使用正确的Slug对象,而不是再次创建
如果需要保留该继承行,请保留基类,但将slug字段提取到它自己的类中,如
class Slug(models.Model):
slug = models.SlugField(_('Slug'), unique=True)
class Base(models.Model):
# all your other fields
slug = ForeignKey(Slug)
class ChildA(Base):
height = models.CharField(max_length=100, )
class ChildB(Base):
is_for_sale = models.BooleanField(_('Is active'), default=True, )
一旦您来到这里,您就可以使用这些类的构造函数来对Slug实施进一步的限制,如果它们还没有提供的话我想您可能误解了继承 如果我没弄错的话,你说那个鼻涕虫一定是独一无二的。因此,您将具有特定slug的类的数量限制为“1” 您的类
ChildB
和ChildA
未“链接”到BaseClass
,而是BaseClass的后代,因此子类的实例也是BaseClass
的实例
在我看来,你似乎在寻找一个Slug对象和多个其他具有不同属性的对象之间的关系
我建议使用如下关系,而不是从类基类派生:
class ChildA(models.Model):
height = models.CharField(max_length=100, )
slug = ForeignKey(Base)
这将确保使用正确的Slug对象,而不是再次创建
如果需要保留该继承行,请保留基类,但将slug字段提取到它自己的类中,如
class Slug(models.Model):
slug = models.SlugField(_('Slug'), unique=True)
class Base(models.Model):
# all your other fields
slug = ForeignKey(Slug)
class ChildA(Base):
height = models.CharField(max_length=100, )
class ChildB(Base):
is_for_sale = models.BooleanField(_('Is active'), default=True, )
一旦您来到这里,您就可以使用这些类的构造函数对Slug实施进一步的限制,如果它们还没有提供如果您只需要一组公共属性,您就要创建一个表,否则django将为它创建一个表 相反,如果您对
Base
的所有子类之间的关系感兴趣,那么您必须放弃继承,使用每个子类到Base
的外键:
class ChildA(models.Model):
base = ForeignKey(Base)
height = models.CharField(max_length=100)
如果您只需要一组公共属性,那么您需要创建一个表,否则django将为它创建一个表 相反,如果您对
Base
的所有子类之间的关系感兴趣,那么您必须放弃继承,使用每个子类到Base
的外键:
class ChildA(models.Model):
base = ForeignKey(Base)
height = models.CharField(max_length=100)
您所说的“我希望新创建的对象链接到现有记录”是什么意思?你可能需要外键吗?是的,我希望它像外键一样工作。因为有时在ChildB中,我想链接到现有的基本记录。通过这种方式,我确保我在Base中始终有一条记录,并在ChildBAm中继承所有属性。我不太确定这是否可能从开始,你说的
是什么意思?我希望新创建的对象链接到现有的记录?你可能需要外键吗?是的,我希望它像外键一样工作。因为有时在ChildB中,我想链接到现有的基本记录。通过这种方式,我确保我在Base中始终有一条记录,并在ChildBAm中继承所有属性。我不太确定是否可以从这开始