#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 и сериализаторов?