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

标签 django

我正在尝试构建一个项目,似乎使用模型继承来满足我的要求效果最好,我有一个基本模型,其中有多个模型使用它进行继承。在基本模型中,我有一个 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”

您的类 ChildBChildA 并未“链接”到 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/

相关文章:

django - 如何在 Django REST 框架 gis 中获取 GeoJSON 响应

django - 在 Django 中将数据从数据库传递到 highcharts

sql - 在 Django 中构造 Q 对象时保持 SQL 运算符优先级

django - 在多容器 Docker 设置中运行 Django 迁移

python - Django 模型表单未生成预期的 HTML

django - Django 中的选择嵌套元组有多深?

python - 条件列显示,django-tables2

Django 表单集不验证

django - 如何在 django 1.9 之后使用 modelform 创建禁用字段

python - django select_related() 和 django-mptt。如何一次获取所有 sibling ?