我正在尝试构建一个项目,似乎使用模型继承来满足我的要求效果最好,我有一个基本模型,其中有多个模型使用它进行继承。在基本模型中,我有一个 slug 字段,该字段在所有模型中都是唯一的(为了完整性)
在我的子模型中,有时我想创建一条记录,但如果父级已经存在,我只想创建子级并直接链接到父级。例如,
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 一定是唯一的。因此,您将具有特定 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 模型继承创建或从父级获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22481735/