Есть ли способ использовать абстрактное значение в поле в Django Framework?
У меня такой код:
class Food(models.Model):
...
class Meta:
abstract = True
class Pizza(Food):
...
class Burger(Food):
...
class Order(models.Model):
...
food_type = models.OneToOneField(Food, on_cascade=CASCADE)
Итак, мне интересно, есть ли способ установить food_type, чтобы он указывал либо на пиццу, либо на модель бургера.
Я пытался сделать это следующим образом:
class Food(models.Model):
order = models.OneToOneField(Order, on_delete=CASCADE)
class Meta:
abstract = True
Но это позволяет иметь и 'Burger' и 'Pizza' связанными с 'Order', а это не то, что мне нужно.
Я не очень понимаю, что вы пытаетесь сделать, но если вы хотите ограничить заказ бургерами или пиццей, вы можете использовать CharField
с заданными вариантами выбора.
class Order(models.Model):
FOOD_BURGER = 'BURGER'
FOOD_PIZZA = 'PIZZA'
FOOD_TYPES = ((TYPE_BURGER, 'Burger'), (TYPE_PIZZA, 'Pizza'))
food_type = models.CharField(max_length=10, choices=FOOD_TYPES)
Затем вы можете проверить, относится ли заказ к определенному типу, выполнив следующие действия:
my_order = Order.objects.get(pk=1)
if my_order.food_type == Order.FOOD_BURGER:
# food type is a burger
elif my_order.food_type == Order.FOOD_PIZZA:
# food type is a pizza
Если вы хотите, чтобы объект Pizza
назначался в заказ только тогда, когда тип FOOD_PIZZA
, вы можете проверить класс объекта.
my_pizza = Pizza.objects.get(pk=1)
my_order = Order.objects.get(pk=1)
if isinstance(my_pizza, Pizza): # my_pizza is an instance of Pizza
my_order.food = my_pizza
my_order.save()
else: # my pizza is not an actual Pizza
# do something else