【问题标题】:Django - Deleting all the related ForeignKeys to a modelDjango - 删除模型的所有相关外键
【发布时间】:2018-04-22 18:23:49
【问题描述】:

我有一个名为 Team 的模型,与 Agent(我的用户模型)有一个 ForeignKey 关系。当team_leader 的代理停用团队时,所有将team_member 设置为当前团队的代理都将删除其team_member 属性并设置为NULL/空。

我读过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

请在我的视图代码和我犯的任何错误上提供一些 cmets 和指针。谢谢。

【问题讨论】:

    标签: django


    【解决方案1】:

    如果我理解正确,我看不出您需要遍历模型字段的原因。

    您可能无需费心处理模型的任何字段即可摆脱困境。当 AgentTeam 值为 null 时,您可以只更新所有代理的 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()
    

    【讨论】:

    • 完美。那行得通。我不得不使用request.user.team_leader 而不是request.user.AgentTeam。当我使用后者时,出现 ['Agent' object has no attribute 'AgentTeam'] 错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2020-10-27
    • 1970-01-01
    • 2019-05-09
    • 2021-05-17
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多