2014-02-15 4 views
0

В моей модели есть две модели.Django Many-To-One при удалении

class Message(models.Model) 
    #there are some fields 
    #... 
    user = models.ForeignKey('User') 


class User(models.Model) 
    # and there 

Мы видим, что пользователь has many сообщения, когда пользователь будет удален, все сообщения будут удалены слишком, или внешний ключ устанавливается в нуль.

Вопрос в том, как я могу обработать сообщение последнего пользователя, удалив событие? Мне нужно сделать что-то подобное при каждом удалении сообщения?

#... 
if user.message_set.count() < 1: 
    user.handle_last_message_delete() 

Есть ли решения на уровне SQL (насколько я знаю, триггеры могут помочь, но я не уверен)?

Если да, то что относительно совместимости ORJ для django?

И какое решение вы бы выбрали, если добавление сообщений происходит гораздо чаще, чем удаление, и только администраторы могут удалять сообщения?

P.S. Большое спасибо заранее.

P.P.S. Я также буду очень благодарен за ссылки на реляционные базы данных.

+1

> Существуют ли решения на уровне SQL (насколько я знаю, триггеры могут помочь, но я не уверен)? - решите, хотите ли вы работать с процессором sql или ORM? – akaRem

+0

Я думаю, что ORM будет более подходящим, потому что приложение выглядит повторно используемым. –

+1

Так что я думаю, что вам не стоит беспокоиться о sql-trigger и реализовывать логику частично с orm, частично с sql. – akaRem

ответ

1

Я думаю, что вы пытаетесь контролировать message удаление в неправильном месте.

Текущая логическая цепочка:

py: user.delete() 
    -> db: delete .. from tuser 
     -> db: cascade .. 
      -> db: trigger .. 
       -> py: ??? // trying to somehow catch last message 

таким образом, бизнес-логики в основном размещены в БД, а не в ОРМ, и есть проблема о том, как связать события с БД ру обратных вызовов. Или вообще не связывать их и помещать всю логику в db?

Если вы хотите управлять удаление с ОРМ, логика должна выглядеть следующим образом:

py: user.delete(): 
    py: messages = user.select_all_messages() // get all messages 
    py: for msg in messages: msg.delete() // or do what you want to do 
     -> sql: delete .. from tmessage 
    py: user.really_delete_from_db() 
     -> db: delete .. from tuser 
      x db: cascade .. // already done 
       x db: trigger .. // no need to catch events 

Таким образом, вы в первую очередь удалить все зависимые объекты с полным контролем их удаления, и только затем удалять записи пользователя без любые неуправляемые побочные эффекты

+0

Спасибо за отличный ответ! –

0

Почему вы хотите удалить пользователя? Вы просто можете добавить логическое поле для его деактивации. Таким образом, вам не придется обрабатывать проблемы с сообщениями.

class User(models.Model) 
    is_activated = models.BooleanField(default=True) 

class Message(models.Model) 
    #there are some fields 
    #... 
    user = models.ForeignKey('User') 
Смежные вопросы