2017-11-09 10 views
0

私はモデルTeamを持ち、ForeignKeyの関係はAgent(私のユーザモデル)です。 team_leaderのエージェントがチームを無効にすると、team_memberが現在のチームに設定されているすべてのエージェントは、team_member属性が削除され、NULL /空に設定されます。Django - モデルに関連するForeignKeysをすべて削除する

thisthisを読みましたが、私は._meta.get_fields()またはCollectorクラスで何かをするはずです。私はget_fields()を試していますが、それを有効にすることはできませんでした。

models.py

class Agent(AbstractUser): 
    team_member = models.ForeignKey('AgentTeam', on_delete=models.CASCADE, null=True, blank=True, related_name='team_member') 
    team_leader = models.OneToOneField('AgentTeam', on_delete=models.CASCADE, null=True, blank=True, related_name='team_leader') 

class AgentTeam(models.Model): 
    team_is_active = models.BooleanField(default=False) 

views.py

def deactivate_team(request): 
    request.user.AgentTeam.team_is_active = False # request.user in this case is the team_leader 

    # I need to set all the Agent's with team_member set to the request.user's team to NULL. I have experimented with the code below and gotten only errors, mostly related to ReverseToOne like ''ReverseManyToOneDescriptor' object is not iterable' 
    agents = [ 
     f for f in AgentTeam._meta.get_fields() 
     if (f.one_to_many) 
     and f.auto_created and not f.concrete 
    ] 
    for agent in agents: 
     objects = getattr(AgentTeam, agent.name).all() 
     for object in objects: 
      object.team_member = None 

私が作ったいくつかのコメントとポインタ私の意見コードにエラーがあれば教えてください。ありがとうございました。

答えて

1

私が正しく理解していれば、モデルフィールドを反復処理する必要はありません。

モデルの任意のフィールドを気にする必要なく、離れてしまうことがあります。 AgentTeamの値が無効になったときに、すべてのエージェントのteam_memberステータスを更新することができます。これは、ビューまたはモデルのsave()メソッドで行うことができます。ビュー内の

class Agent(AbstractUser): 
    team_member = models.ForeignKey('AgentTeam', on_delete=models.CASCADE, null=True, blank=True, related_name='team_member') 
    team_leader = models.OneToOneField('AgentTeam', on_delete=models.CASCADE, null=True, blank=True, related_name='team_leader') 

class AgentTeam(models.Model): 
    team_is_active = models.BooleanField(default=False) 

    def save(self, *args, **kwargs): 
     super(AgentTeam, self).save(*args, **kwargs) 
     if not self.team_is_active: 
      Agent.objects.filter(
       team_member=self 
      ).update(team_member=None) 

そして:

def deactivate_team(request): 
    team = request.user.AgentTeam 
    team.team_is_active = False 
    team.save() 
+0

パーフェクトたとえば。それはうまくいった。私は 'request.user.AgentTeam'の代わりに' request.user.team_leader'を使用しなければなりませんでした。後者を使用すると、['Agent'オブジェクトに 'AgentTeam'属性がありません。]エラーが発生しました。ありがとうございました! – Valachio

関連する問題