Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型继承创建或从父级获取_Django - Fatal编程技术网

Django模型继承创建或从父级获取

Django模型继承创建或从父级获取,django,Django,我正在尝试构建一个项目,似乎对我的需求使用模型继承可以发挥最好的作用,我有一个基本模型,其中我有几个模型使用它进行继承。在基本模型中,我有一个slug字段,它在所有方面都是唯一的(为了完整性) 在我的子模型中,有时我想创建一个记录,但如果父项已经存在,我只想创建子项并直接链接到父项。比如说, class Base(models.Model): slug = models.SlugField(_('Slug'), unique=True) #Other fiels class Chi

我正在尝试构建一个项目,似乎对我的需求使用模型继承可以发挥最好的作用,我有一个基本模型,其中我有几个模型使用它进行继承。在基本模型中,我有一个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的类的数量限制为“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中继承所有属性。我不太确定是否可以从这开始