Django дочерняя модель с родительским OneToOne не наследует родительские поля? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть родительский класс 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 не наследуется? И какой самый лучший / самый элегантный способ создания этих объектов здесь? Или есть недостаток дизайна? Спасибо и извинения - я новичок в этом.

...