класс django с массивом «родительских» выпусков чужих ключей - PullRequest
0 голосов
/ 20 марта 2010

Допустим, у меня есть класс под названием Fruit с дочерними классами различных видов Fruit с их собственными специфическими атрибутами, и я хочу собрать их в FruitBasket:

класс фруктов (models.Model):
type = models.CharField (max_length = 120, по умолчанию = 'банан', выбор = FRUIT_TYPES) ​​
...

класс банан (фрукты):
"" "банан (фруктовый тип)" ""
length = models.IntegerField (blank = True, null = True) ...

класс апельсин (фрукты):
"" "апельсин (фруктовый тип)" ""
Diameter = models.IntegerField (blank = True, null = True) ...

класс FruitBasket (models.Model):
fruits = models.ManyToManyField (Фрукты) ...

Проблема, с которой я, похоже, сталкиваюсь, заключается в том, что когда я получаю и проверяю Fruits в FruitBasket, я получаю только базовый класс Fruit и не могу получить атрибуты дочернего класса Fruit.

Мне кажется, я понимаю, что происходит - когда массив извлекается из базы данных, единственными полями, которые извлекаются, являются поля базового класса Fruit. Но есть ли способ получить атрибуты дочернего класса без нескольких дорогостоящих транзакций базы данных? (Например, я мог бы получить массив, а затем извлечь дочерние классы Fruit по идентификатору каждого элемента массива).

спасибо заранее, Чак

Ответы [ 2 ]

0 голосов
/ 21 марта 2010

Мы решили эту проблему, добавив общий внешний ключ к родительскому классу.Когда save () завершено, класс / идентификатор дочернего элемента сохраняется в родительском.Затем, когда у вас есть массив родительских объектов (в данном случае, Fruits), вы можете сказать parent.child и у вас есть полный объект дочернего класса.Этот вопрос поднимался несколько раз, и я немного удивлен, что его нет по крайней мере в списке пожеланий для функций ORM.(или может быть, и я просто пропустил это ...)

0 голосов
/ 20 марта 2010

http://docs.djangoproject.com/en/dev/topics/db/models/#id7

Хитрость в том, что поскольку это ссылка на класс Fruit, вы можете не знать, какой это фрукт. Но, если вы это сделаете, то вы просто получите доступ к экземпляру подкласса через автоматическое отношение OneToOne: mybasket.fruits.all()[0].orange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...