У меня есть родительский класс 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}"