Django наследование и проблемы OneToOneField: Поле определяет связь с моделью Di sh, которая либо не установлена, либо является абстрактной. - PullRequest
0 голосов
/ 05 мая 2020

У меня есть родительский класс Dish и дочерний Pizza (среди других типов di sh). Я пытаюсь сделать Dish абстрактным сейчас, снял регистрацию с admin.py, потому что в конечном итоге каждый Di sh имеет какой-то тип, и каждая пицца - это ровно один Di sh (соответствует 1 di sh ID) - отсюда мой OneToOneField logi c (если в этом есть смысл). Сначала у меня был бетон Dish, но когда я добавляю class Meta: abstract = True, я получаю следующие ошибки:

orders.Pizza.dish: (fields.E300) Field defines a relation with model 'Dish', which is either not installed, or is abstract.
orders.Pizza.dish: (fields.E307) The field orders.Pizza.dish was declared with a lazy reference to 'orders.dish', but app 'orders' doesn't provide model 'dish'.

Я читал другие сообщения SO, в которых предлагалось указать здесь имя приложения (orders): dish = models.OneToOneField('orders.Dish', etc.., но это тоже не работает, к тому же все модели находятся в models.py в одном приложении orders. Ниже мой код. В чем проблема?

class Dish(models.Model):
  PIZZA = 'PIZZA'
  SUB = 'SUB'
  PASTASALAD = 'PASTASALAD'
  PLATTER = 'PLATTER'
  TYPE_CHOICES = ( (PIZZA, 'Pizza'), (SUB, 'Sub'), (PASTASALAD, 'PastaSalad'), (PLATTER, 'Platter') )
  name = models.CharField(max_length=64, blank=True) # blank makes name optional
  type = models.CharField(max_length=64, choices=TYPE_CHOICES, blank=True)
  size = models.CharField(max_length=1, choices=SIZE_CHOICES, default=SMALL, blank=True)
  price = models.DecimalField(max_digits=6, decimal_places=2, default=None)

  class Meta:
        abstract = True

  def __str__(self):
    return f"{self.name} {self.size} - Price: ${self.price}"

class Pizza(Dish):
  dish = models.OneToOneField(Dish, on_delete=models.CASCADE, related_name="dish_id_pizza", parent_link=True)
  REGULAR = 'REGULAR'
  SICILIAN = 'SICILIAN'
  STYLE_CHOICES = ( (REGULAR, 'Regular'), (SICILIAN, 'Sicilian'),)
  style = models.CharField(max_length=7, choices=STYLE_CHOICES, default=REGULAR)
  topping_count = models.IntegerField(default=0, validators=[MaxValueValidator(5), MinValueValidator(0)])

  def __str__(self):
    return f"{self.size} {self.style} pizza with {self.topping_count} toppings: ${self.price}"
...