2016-06-24 10 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信号を使用する必要がありました。

関連する問題