2009-07-14 4 views
1

Предположим, что у меня есть следующие модели:Родовой объект «собственность» в Django

class User(models.Model): 
    pass 

class A(models.Model): 
    user = models.ForeignKey(User) 

class B(models.Model): 
    a = models.ForeignKey(A) 

То есть, каждый пользователь владеет некоторые объекты типа А, а также некоторые из типа B. Теперь я пишу общий интерфейс, который позволит пользователю просматривать любые принадлежащие ему объекты. В представлении, конечно, я не могу сказать что-то вроде «objects = model.objects.filter (user = user)», так как B не имеет атрибута «пользователь». Каков наилучший подход?

ответ

0

Путь я хотел бы сделать это, чтобы просто пройти через объект «а» на классе В. Таким образом, в представлении, я хотел бы сделать:

objects = B.objects.get(user=a.user) 
objects += A.objects.get(user=user) 

Причина, я хотел бы сделать это таким образом, потому что это, по сути, два запроса к базе данных, один для извлечения связки объектов A и один для извлечения связки объектов B. Я не уверен, что в Django возможно получить список обоих, просто из-за того, как работает наследование базы данных.

Вы также можете использовать model inheritance. Это будет делать базовый класс для обоих объектов A и B, который содержит общие поля, а затем извлекает список базовых классов, а затем преобразует их в соответствующие типы.

Edit: В ответ на ваш комментарий, я предлагаю затем сделать базовый класс, который содержит следующую строку:

user = models.ForeignKey(User) 

класса А и В могут затем наследовать от базового класса, и вы можете таким образом, в настоящее время просто получите все объекты из этого класса. Предположим, что ваш базовый класс был назван «C»:

objects = C.objects.get(user=user) 

Это будет получить все С, а затем вы можете выяснить их конкретные типы, перейдя по каждому объекту в объектах и ​​определить их тип:

for object in objects: 
    if object.A: 
     #code 
    if object.B: 
     #code 
+0

Мне нужно, чтобы это было общим, так что представление напрямую не знает, что B содержит объект типа A. Ему просто нужно дать имя модели и пользователю и создать список объектов, которыми владеет пользователь , –

+0

Смотрите мое редактирование в моем сообщении выше. – AlbertoPL

+0

Спасибо, я думаю, что сработает. Думаю, мне просто кажется, что я каким-то образом загрязняю объектную модель, так как концептуально каждый объект не обязательно должен иметь атрибут «пользователь», поскольку он может быть выведен без него. –

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