Есть ли способ использовать абстрактное значение в поле в 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
Вернуться на верх