Как создать абстрактную модель в Django? - PullRequest
2 голосов
/ 16 февраля 2020

Я новичок в Django framework и в моем проекте у меня есть модель под названием Layer.

class Layer(models.Model):
    name = models.CharField(max_length=255)

Я бы хотел, чтобы слой имел отношения с абстрактной моделью, называемой "Geometry", более конкретно один слой должен иметь одну геометрию или не иметь ее, а одна геометрия должна принадлежать одному слою.

Проблема заключается в том, что у меня есть типы геометрий, и все они имеют разные свойства, поэтому я решил создать несколько геометрий:

class Circle(models.Model):
    radius = models.CharField(max_length=255)

class Rectangle(models.Model):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)

Я хотел бы иметь структуру данных, в которой обе модели бывают одного типа (геометрия). Я хотел бы вызвать layer.geometry и иметь возможность получить либо круг, либо прямоугольник, либо крест и так далее. Это возможно? И как будет выглядеть форма базы данных? Django собирается создать две разные таблицы или одну таблицу с объединенными свойствами?

Заранее спасибо

1 Ответ

4 голосов
/ 16 февраля 2020

Django поддерживает наследование, хотя оно не очень распространено. Таким образом, вы можете создать модель Geometry, и пусть Circle и Rectangle наследуют от этого:

class <b>Geometry</b>(models.Model):
    pass

class Circle(<b>Geometry</b>):
    radius = models.CharField(max_length=255)

class Rectangle(<b>Geometry</b>):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)

Более того, мы можем ForeignKey (или другое отношение) к этому Geometry класс с:

class Layer(models.Model):
    name = models.CharField(max_length=255)
    geometry = <b>models.ForeignKey(Geometry, on_delete=models.CASCADE)</b>

Django выполнит миграции, которые для базы данных SQL создадут таблицы для Geometry, Circle и Rectangle. Модели Circle и Rectangle будут иметь неявное значение OneToOneRelation для таблицы для Geometry с именем geometry_ptr_id, которое, таким образом, относится к родителю.

Для получения дополнительной информации см. Раздел о наследование нескольких таблиц в документации .

...