django .db.utils.OperationalError: несоответствие внешнего ключа - "orders_suborder" ссылается на "orders_sub" - PullRequest
0 голосов
/ 06 мая 2020

У меня есть родительский класс Sub (бетон) и дочерний класс SubOrder. Один Подзаказ может «иметь» (т.е. находиться в) многих Подзаказах, а один Подзаказ может «иметь» (содержать) много Подзапасов. Теперь, когда я пытаюсь создать подобъект, я получаю сообщение об ошибке:

django.db.utils.OperationalError: foreign key mismatch - "orders_suborder" referencing "orders_sub"

В чем проблема? Нужно ли мне использовать ManyToManyField (если да, то почему и где?) И почему я получаю эту ошибку?

Это мои классы в models.py:

class Sub(Dish):
  dish = models.OneToOneField(Dish, on_delete=models.CASCADE, related_name="dish_id_sub", parent_link=True)

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

class SubOrder(Sub):
  sub_id = models.ForeignKey(Sub, related_name="sub_id", parent_link=True)
  item_id = models.ForeignKey(Item, on_delete=models.CASCADE, primary_key=True, related_name="sub_item_id")
  extra_count = models.IntegerField(default=0, validators=[MaxValueValidator(4), MinValueValidator(0)])
  MUSHIES = 'M'
  PEPPERS = 'P'
  ONIONS = 'O'
  XTRCHEESE = 'C'
  EXTRA_CHOICES = ((MUSHIES, 'Mushrooms'), (PEPPERS, 'Peppers'), (ONIONS, 'Onions'), (XTRCHEESE, 'Extra Cheese'),)
  extra_1 = models.CharField(max_length=1, choices=EXTRA_CHOICES, blank=True)
  extra_2 = models.CharField(max_length=1, choices=EXTRA_CHOICES, blank=True)
  extra_3 = models.CharField(max_length=1, choices=EXTRA_CHOICES, blank=True)
  extra_4 = models.CharField(max_length=1, choices=EXTRA_CHOICES, blank=True)

  def __str__(self):
    extras = []
    for i in range(extra_count):
      str = "extra_"+i
      extras.append(str)
    return f"Sub Order: Item {self.item_id}, {self.name}, size: {self.size}. {self.extra_count} Extras: {extras}"

If это важно, вот родительский класс Sub Dish, но я не думаю, что проблема:

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)
  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)

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