2017-03-06 56 views
9

Mam model w django, który ma klucz obcy z modelem użytkownika.Jak ustawić pełną nazwę użytkownika w polu klucza obcego za pomocą Modelu użytkownika za pomocą atrybutu on_delete?

class News(models.Model): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET(???)) 
    message - models.TextField() 

Tak więc, gdy dowolne konto użytkownika zostanie usunięte z bazy danych, wówczas wpisy w tablicy Wiadomości również zostaną usunięte zgodnie z użytkownikiem. Więc chcę, że gdy dowolne konto użytkownika skasowany wtedy trzeba ustawić jego/jej imię i nazwisko w polu użytkownika za pomocą 'on_delete=models.SET(???)'

Przykład:

Jeśli mam użytkownika, że ​​first_name = „neeraj” i LAST_NAME = 'Kumar' Kiedy chcę usunąć to konto użytkownika, a następnie w tabeli Wiadomości chcę zapisać jego nazwisko.

Odpowiedz

9

user w polu w News Modeluje mapy z instancją modelu User.

Nie można przypisać ciąg do tego pola. Można przypisać tylko wartość zerową instancji modelu User.

Musisz wprowadzić zastępczego użytkownika, aby zastąpić usuniętego użytkownika. Więc albo zarezerwować użytkownika do zastąpienia lub utworzyć go w momencie usunięcia. Wyjaśniono to bardzo wyraźnie w docs.

Jedną z rzeczy, którą można zrobić, jest dodanie nowego pola name do modelu News i wypełnienie go podczas tworzenia instancji News.

class News(models.Mode): 
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET_NULL) 
    name = models.CharField() 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.name = self.user.first_name + self.user.last_name 
     super(News, self).save(*args, **kwargs) 

Teraz kiedy User zostanie usunięty user pole jest ustawione na NULL i name pole zawiera wymagane informacje nazwy.

+1

Mimo że jest to dobre rozwiązanie, klucz obcy nie ma żadnego znaczenia. Tak, istnieje odwrotna relacja, ale musisz zaimplementować "znajdź posty według nazwiska autora" niezależnie i dodać dodatkową logikę dla rzeczy, które nie są już możliwe dla usuniętego autora. Najlepszym rozwiązaniem nie jest umożliwienie usunięcia użytkowników, ale oznaczyć je jako nieaktywne. Dlatego w modelu użytkownika występuje 'is_active'. – Melvyn

0

Podobnie jak w poprzedniej odpowiedzi, nie można przypisać wartości ciągu do pola ForeignKey. Dzięki temu rozwiązaniu on_delete możesz przypisać w tym przypadku specjalnego użytkownika coś takiego jak usunięte. Ponadto, jeśli naprawdę chcesz przypisać nazwę użytkownika do innego pola, możesz to zrobić za pomocą sygnału Django. Nic nie może zrobić z on_delete.

from django.conf import settings 
from django.contrib.auth import get_user_model 
from django.db import models 

def get_sentinel_user(): 
    return get_user_model().objects.get_or_create(username='deleted')[0] 

class MyModel(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     on_delete=models.SET(get_sentinel_user), 
    )