У меня есть родительский класс Dish
и дочерний элемент Pizza
, который наследуется от Dish
. Они имеют отношение 1 к 1, и я написал их следующим образом:
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}"
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}"
Теперь у меня есть Dish
объект с ID = 17 и ценой 21,95, type = Pizza, size = Small, type = Regular , Теперь я пытаюсь создать соответствующий объект Pizza
следующим образом:
>>> parent=Dish.objects.get(pk=17)
>>> new_17_pizza = Pizza(dish=parent, topping_count=2, style="Regular")
>>> new_17_pizza.save()
Я бы предположил, что все поля и значения Dish
унаследованы, т.е. мне не нужно повторять их, но я получаю :
sqlite3.IntegrityError: NOT NULL constraint failed: orders_dish.price
Почему это так? Я знаю, что не разрешаю blank=True
для price
в Dish
, но там IS уже значение 21,95 хранится в родительском di sh. Почему 21,95 не наследуется? И какой самый лучший / самый элегантный способ создания этих объектов здесь? Или есть недостаток дизайна? Спасибо и извинения - я новичок в этом.