Универсальный объект "собственность" в Джанго - PullRequest
1 голос
/ 14 июля 2009

Предположим, у меня есть следующие модели:

class User(models.Model):
    pass

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

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

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

1 Ответ

0 голосов
/ 14 июля 2009

Я бы сделал так, чтобы просто пройти через объект «а» в классе B. Итак, в представлении я бы сделал:

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

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

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

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

user = models.ForeignKey(User)

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

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

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

for object in objects:
    if object.A:
        #code
    if object.B:
        #code   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...