2016-04-03 4 views
2

Я только что начал в Python и Django, и я пытаюсь сделать что-то довольно простое, но после многих часов поиска я не нашел ответа, поэтому здесь на него приходит мой вопрос:Как установить нулевую ссылку на ForeignKey - Django

У меня есть модели: User (CustomUser) и House.

Я хочу иметь поле в User, которое ссылается на Дом, и которое может быть необязательным, подражая факту, что человек может находиться внутри (когда ссылка прилагается) или снаружи (когда это пустой) дом. В модели House я хочу иметь также «список» людей (пользователей), которые находятся в данный момент в доме.

Для достижения этой цели, я сделал что-то вроде этого:

class User(AbstractBaseUser): 
# other attrs ... 

# (ForeignKey) house: House where the user is right now 
house = models.ForeignKey(House, 
    verbose_name='where is the user right now', 
    related_name='house_now', blank=True, null=True, 
    on_delete=models.SET_NULL 
) 
def leaveHouse(self): 
    house = self.house.delete() 

class House(models.Model): 
# (ManyToManyField) people: List of Users that are currently within the house 
people = models.ManyToManyField(settings.AUTH_USER_MODEL, 
      verbose_name='people inside the house right now', 
      related_name='people', 
      blank=True 
     ) 

def removeUser(self, user): 
    self.people.remove(user) 

Проблема заключается в том, что, когда я использую функцию leaveHouse модели пользователя, вместо установки ForeignKey в Null или Empty, он удаляет объект Дома, на который ссылается ключ.

Любое предложение о том, что я делаю неправильно, лучшие практики и такие вещи, пожалуйста?

Заранее благодарен!

EDIT:

Во всяком случае, только немного вопрос, связанный с этим. Почему в администраторе django, если я установил поле «house» как «----» (None), отлично работает, но если я установил поле «home» как «----», то дал мне «'NoneType' объект не имеет атрибута 'рк'»

# (ForeignKey) home: Main house 
    home = models.ForeignKey(House, 
     verbose_name='default house', 
     related_name='home', blank=True, null=True, 
     on_delete=models.SET_NULL 
    ) 

ответ

4

Вместо удаления связанной house объекта, установите значение ссылки на None:

self.house = None 
self.save() 
+0

Oopss .. Спасибо Вам! Я попытался установить его в None, но ничего не знал о спасении. self.save() сохраняет состояние объекта тогда? P.S: @alecxe Прочтите редактирование в главном вопросе, пожалуйста :) –

+0

@ GuillermoLópez хорошо, что, если вы удалите это 'on_delete = models.SET_NULL' часть? Разве это имеет значение? Благодарю. – alecxe

+0

Выяснил это. < Имел функцию в той же модели, которая пыталась получить доступ к этому полю, и я не делал правильных проверок, когда это None. В любом случае спасибо –

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