Django Наследование ORM: вы пытаетесь добавить ненулевое поле 'dish_ptr' в [...] без значения по умолчанию - PullRequest
1 голос
/ 01 апреля 2020

Я работаю над ресторанным приложением (и новым для Django / Python). Я хочу иметь родительский класс Di sh, который будет содержать некоторый счетчик или идентификатор, который увеличивается для каждого экземпляра дочернего класса Di sh. Примерами являются такие блюда, как Pizza, Pasta и др. c с различными характеристиками и отношениями. Я пытаюсь сделать Dish конкретным, потому что в этом случае я считаю, что я просто получаю доступ к Dish PK, и это даст каждому пункту меню Di sh -ID. Однако я не знаю, как правильно исправить обнаруженные ошибки: You are trying to add a non-nullable field 'pasta_ptr'.

Вот соответствующие фрагменты кода:

class Dish(models.Model):
  pass # should automatically generate PK, right?

class Pasta(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price = models.DecimalField(max_digits=6, decimal_places=2)

  def __str__(self):
    return f"{self.name}, price: ${self.price}"

class Pizza(Dish):
  sizestyle = models.CharField(max_length=4, choices=SIZESTYLE_CHOICES, default=SMALL_REGULAR)
  topping_count = models.IntegerField(default=0, validators=[MaxValueValidator(5), MinValueValidator(0)])
  price = models.DecimalField(max_digits=6, decimal_places=2)

  def __str__(self):
    return f"Price for {self.sizestyle} pizza with {self.topping_count} toppings: ${self.price}"

class Sub(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price_category = models.ForeignKey(SubPrice, on_delete=models.DO_NOTHING, related_name="sub_price_category")

  def __str__(self):
    return f"{self.name}, Price Category: {self.price_category}"

class Platter(Dish):
  name = models.CharField(max_length=64, primary_key=True)
  price_large = models.DecimalField(max_digits=6, decimal_places=2, default=0)
  price_small = models.DecimalField(max_digits=6, decimal_places=2, default=0)

  def __str__(self):
    return f"{self.name} price: Large ${self.price_large}, Small ${self.price_small}"

1 Ответ

1 голос
/ 01 апреля 2020

Если вы хотите наследовать от Dish(), но не имеете его в базе данных, вы можете сделать это: Django абстрактный документ базового класса

class Dish(models.Model):
    # your model structure

    class Meta:
        abstract = True

class Pizza(Dish):
    # your model structure

Это просто наследуйте все, что есть в Di sh, когда вы его используете. Вы не увидите Di sh в качестве таблицы в базе данных.

Если вы хотите использовать его в качестве родительского класса, вам нужно сообщить подклассам, что Di sh является родительским классом: django много к одному документу

class Dish(models.Model):
    pass

class Pizza(models.Model):
    dish = models.ForeignKey(Dish, on_delete=models.CASCADE)
    # other model structure

Это создаст идентификатор для Di sh в базе данных, и когда Pizza будет создан, он будет ссылаться на идентификатор (pk) Di sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...