Наследование модели Django и дочерние элементы доступа на основе категории

#django #python-2.7 #django-models

#django #python-2.7 #django-модели

Вопрос:

Я хочу получить значения родительского класса с каждым дочерним значением? Как я могу определить дочерние объекты для извлечения?

У меня такая структура модели Django.

 class Category(models.Model):
    name = models.CharField(max_length=80)


class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)
    category = models.ForeignKey('Category')


class PizzaRestaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)


class PastaRestaurant(Place):
    extra = models.CharField(max_length=80)
  

Когда мы выполняем операцию, мы можем сохранить объект, как показано ниже. И он сохраняется в БД, как я и ожидал. две записи в таблице размещения и каждая запись в каждой таблице дочерних объектов.

 a = Category()
a.name = "pasta"

b = Category()
b.name = "pizza"

a.save()
b.save()

x = PastaRestaurant()
x.address = "Pasta Address"
x.name = "Pastamonia"
x.extra = "some extra"
x.category = a

y = PizzaRestaurant()
y.address = "Pizza Address"
y.name = "Dominos"
y.serves_hot_dogs = 1
y.serves_pizza = 0
y.category = b

x.save()
y.save()
  

Теперь мне нужно получить доступ к такому

 p = Place.objects.get(id=1)
  

Как я могу узнать, какие объекты / атрибуты принадлежат объектам размещения?
Поэтому, когда я выбираю место с общими атрибутами, я также должен иметь возможность получать соответствующие значения дочерних объектов.

Или любая другая работа по разработке модели для моих нужд?

Ответ №1:

Если вы хотите получить доступ к атрибутам дочерней модели, вам необходимо получить ее как эту модель, т.Е. PizzaRestaurant Или PastaRestaurant , в противном случае вы получите только Place объект.

Если вам нужно получить все места независимо от подкласса, взгляните на InheritanceManager из django-model-utils . Используя это, вы можете реализовать перегруженные операции для выполнения действий, специфичных для подкласса.

Комментарии:

1. django-model-utils поддерживает Django 1.4 — 1.9. Это не для текущей версии 1.10? для новых выпусков Django Мы не знаем, что это работа?

2. Я использую его с 1.10 без проблем.

Ответ №2:

django-polymorphic прекрасно справляется с этим, улучшая возможности работы с наследованием модели следующим образом:

из polymorphic.models импортируйте PolymorphicModel

 class Place(PolymorphicModel):
    ...

class PizzaRestaurant(Place):
    ...

class PastaRestaurant(Place:
    ...


>>> some_place = Place.objects.create(name="Walmart")
>>> some_pizza_place = PizzaRestaurant.objects.create(name="Slice King", address="101 Main St., Bismarck, ND", category = Category.objects.first(),serves_pizza=True)
>>> some_pizza_place.instance_of(PizzaPlace)
True
>>> PizzaRestaurant.objects.all()
queryset<['Slice King',]>
>>> Place.objects.all()
queryset<['Walmart', 'Slice King',]>
  

Комментарии:

1. Как это будет поддерживаться с помощью фреймворка django-rest и сериализаторов?