2017-03-06 3 views
9

User 모델을 가진 foreignkey를 가진 django의 모델을 가지고 있습니다.on_delete 속성을 사용하여 사용자 모델을 사용하여 외부 키 필드에 사용자의 전체 이름을 설정하려면 어떻게해야합니까?

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

그래서 사용자 계정이 데이터베이스에서 삭제되면 뉴스 테이블 항목도 사용자에 따라 삭제됩니다. 그래서 나는 어떤 사용자 계정이 다음 삭제하면 내가 사용하는 사용자 필드에 그/그녀의 이름을 설정해야한다는 것을 원하는 'on_delete=models.SET(???)'

예 :

나는 = 'Neeraj'과 LAST_NAME을 FIRST_NAME 사용자가있는 경우 = 'Kumar' 해당 사용자 계정을 삭제하려면 News 테이블에서 그의 이름을 저장하고 싶습니다.

답변

9

user 필드는 News 모델은 User 모델 인스턴스에 매핑됩니다.

문자열을이 필드에 할당 할 수 없습니다. null을 할당 할 수있는 것은 User 모델 인스턴스입니다.

삭제 된 사용자 대신 배치 할 대체 사용자를 제공해야합니다. 따라서 대체를 위해 사용자를 예약하거나 삭제시 사용자를 생성하십시오. docs에서 매우 명확하게 설명됩니다.

필드를 News 모델에 추가하고 News 인스턴스를 만들 때이 필드를 채우십시오. User가 삭제 될 때

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) 

은 이제 user 필드는 NULL로 설정하고 name 필드는 필수 이름 정보를 포함합니다.

+1

이 방법은 좋은 해결책이지만, 외래 키는 아무런 도움이되지 않습니다. 네, 반대의 관계가 있지만, 저자 이름에 관계없이 "find posts"를 구현하고 삭제 된 저자에게는 더 이상 가능하지 않은 것에 대한 추가 논리를 추가해야합니다. 가장 좋은 해결책은 사용자를 삭제하지 않고 비활성으로 표시하는 것입니다. 이것이 사용자 모델에'is_active'가있는 이유입니다. – Melvyn

0

이전 대답과 마찬가지로 ForeignKey 필드에 문자열 값을 할당 할 수 없습니다. 이 on_delete 접근 방식을 사용하면 특수 사용자에게이 경우 삭제 된 것과 같은 것을 지정할 수 있습니다. 또한, 사용자의 이름을 다른 필드에 실제로 지정하려면 Django 신호로 할 수 있습니다. 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), 
    )