2016-06-24 3 views
0

저장하기 전에 인스턴스 값을 가져올 수 없다는 문제가 있습니다. save() 메서드에서 업데이트 된 값이 반환됩니다. 또한 너무 많은 쿼리를 실행 중이므로 __init__에 저장할 수 없습니다.Django 모델을 저장하기 전에 속성 검색

class Users(models.Model): 
    username = models.CharField(max_length=20) 

class Groups(models.Model): 
    name = models.CharField(max_length=100) 
    user = models.ManyToManyField(Users) 
    '''def __init__(self, *args, **kwargs): 
     super(Groups, self).__init__(*args, **kwargs) 
     #store original values 
     for field in Groups._meta.get_fields(): 
      f = field 
      if not f.many_to_many: 
       setattr(self, '__original_%s' % f.name, getattr(self, f.name)) 
      else: 
       userlist = Users.objects.all().filter(groups__id=self.pk) 
       setattr(self, '__original_userlist', set(userlist)) #set() to force lazy query and get original value''' 

    #function trying to reproduce __init__ 
    def store(self): 
     for field in Groups._meta.get_fields(): 
      f = field 
      if not f.many_to_many: 
       setattr(self, '__original_%s' % f.name, getattr(self, f.name)) 
      else: 
       userlist = Users.objects.all().filter(groups__id=self.pk) 
       setattr(self, '__original_userlist', set(userlist)) #set() to force lazy query 


    def save(self, *args, **kwargs): 
     self.store() 
     print(getattr(self, '__original_userlist')) #return the list with users 
     super(Groups, self).save(*args, **kwargs) 
     print(getattr(self, '__original_userlist')) #return the list with users 

내가 쿼리를 확인해야하기 때문에 가장 좋은 방법은 접근 할 확실하지 않다 : 사용자가 여기에 예를

내 모델은 단순화 된 것을 저장하는 경우에만 나는 쿼리를 실행합니다. 이전 값과 새 값을 비교하기 위해이 작업을 수행하고 있습니다. 그런 다음 로그 파일에 다른 값을 저장할 수 있습니다.

답변

0

super() 호출 전에 인스턴스를 다시 쿼리하고 해당 개체를 사용하여이 문제를 해결했습니다. 모든 필드에 대해 이전 값을 반환했지만 m2m 필드도 확인해야하며 users.None으로 표시됩니다.

m2m의 값을 얻으려면 m2m_change 신호를 사용해야했습니다!

관련 문제