2013-02-21 5 views
4

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

В настоящее время я сражаюсь с наследованием с несколькими столами, и у меня есть проблема. Я хотел бы иметь одну родительскую модель и несколько дочерних моделей, которые наследуют некоторые поля родителя.

class Parent(models.Model): 
    pass 

class Child1(Parent): 
    fieldX = models.CharField() 

class Child2(Parent): 
    fieldY = models.CharField() 

Однако я хотел бы получить доступ к родительской модели childs с использованием первичного ключа. Так что ...

Parent.objects.all() 

должен возвращать child1 и Child2 объекты с их полями (fieldX, Fieldy), а также.

(Пусть считать, что родительская запись с рк = 1 является Child1 модель)

Хотя, когда я пытаюсь получить доступ к ребенку поля по родительской модели

child = Parent.objects.get(pk=1) 
child.fieldX 

Джанго возвращает AttributeError: «Родитель 'объект не имеет атрибута' fieldX '

Моя цель - создать что-то вроде одного первичного ключа для всех дочерних моделей. Это возможно в Django? Соответственно, есть ли подобное решение или предложение? Я искал в смежных вопросах, таких как contenttype или GUID, UUID, но я полагаю, что это не то, что я ищу. Спасибо за помощь!

ответ

3

Когда вы делаете Parent.objects.get(pk=1) вы получаете Child1 и Child2 строки в порядке, но Джанго ORM возвращает вам Parent экземпляры, так как это только извлекать данные, хранящиеся на родительской таблице.

Чтобы получить экземпляр модели для детей, вы должны сделать parent_instance.childmodelname.

Это может стать беспорядочным, если у вас есть несколько дочерних классов, поскольку вы должны точно знать, к какой дочерней модели принадлежит родительский экземпляр, чтобы иметь доступ к нему (если вы попытаетесь, например, получить доступ к parent.child1 являющийся экземпляром Child2, он вызовет исключение).

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

Смежные вопросы