2009-12-17 2 views
0

Это то, что я имел раньше (но понял, что вы не можете сделать это, очевидно, в следующем порядке:Как я должен построить эту модель Django, чтобы делать то, что я хочу

class MasterAdmin(models.Model): 
    """ 
    A permanent admin (one per Account) that shouldn't be deleted. 
    """ 
    admin = models.OneToOneField(AccountAdmin) 

class Account(models.Model): 
    """ 
    A top-level account in the system. 
    """ 
    masteradmin = models.OneToOneField(MasterAdmin) 


class AccountAdmin(models.Model): 
    """ 
    An Account admin that can be deleted. This includes limited permissions. 
    """ 
    account = models.ForeignKey(Account) 

Я думаю, что вы можете увидеть, что я хочу сделать из примера.Я хочу иметь MasterAccountAdmin, который разделяет атрибуты из AccountAdmin. Целью является то, что я хочу дать людям возможность удалить AccountAdmin, но не MasterAccountAdmin. Я не хотел просто иметь атрибут на AccountAdmin называется «master = models.BooleanField()».

Очевидно, что этот пример не будет работать, потому что MasterAdmin ссылается на AccountAdmin befo но я хотел показать, чего я пытаюсь достичь. Я думаю, что все это неправильно?

+2

-1: Действительно плохой вопрос. Можете ли вы исправить название, чтобы быть вашим реальным вопросом? Возможно, «Как определить три модели с круговыми ссылками» или что-то, что описывает проблему. –

+0

Это достойный титул, если вы прочитали вопрос, прежде чем сосредоточиться на коде. Я не спрашиваю, как технически достичь того, что говорит мой код. Я спрашиваю, что является хорошим способом написать модель (по сравнению с моим путем) для достижения цели высокого уровня, которую я пытаюсь достичь. – orokusaki

ответ

3

Почему бы не просто сделать is_master свойство AccountAdmin, а затем переопределить метод delete(), чтобы убедиться, что is_master не является истинным?

+0

Это лучший подход, чем то, что делает OP, но я хотел ответить на его вопрос, связанный с передовыми ссылками. – cethegeek

+0

О, хорошая точка. Я был так занят архитектурой, что не видел вопроса (и это была проблема, с которой я столкнулся, когда впервые работал в Django). – Tom

2

Если у вас есть прямые ссылки, используйте кавычки.

admin = models.OneToOneField('AccountAdmin') 

See the docs.

Если вам нужно создать отношения на модели, которая еще не была определена, вы можете использовать имя модели, а не самой модели объекта ...

+0

Спасибо! Кстати, это очень Pythonic делать (это в цитатах)? – orokusaki

+2

Это особенность django, чтобы вместить такие отношения. Это совершенно приемлемая практика, но она явно не поддерживается python. – jcdyer

+0

Что сказал jcd. Я обновил свой ответ, чтобы иметь ссылку на документы. – cethegeek