【问题标题】:How to automatically update a field when creating another record in different models?在不同模型中创建另一条记录时如何自动更新字段?
【发布时间】:2022-10-23 23:43:33
【问题描述】:

我有两个看起来像这样的模型:

class TeamMember(models.Model):
    member = models.ForeignKey(User, on_delete=models.SET(get_default_team_member), 
                verbose_name='Member Name', related_name="team_members")
    team = models.ManyToManyField('Team', verbose_name='Team Name', 
            related_name="team_members", blank=False, default=team_id)
    shift = models.ForeignKey(Shift, on_delete=models.PROTECT)
... 
class Team(models.Model):
    name = models.CharField(max_length=50)
    members = models.ManyToManyField(TeamMember, blank=True, related_name="members")

`

用户使用管理面板添加新成员。添加新成员时,我想自动将该成员添加到关联团队。

例如,添加 John 时,需要为他分配一个团队(blank=False),该团队来自我们在 Team 模型中的团队。那么如何更新 Team 模型中的成员以相应地将 John 添加到其中一个团队中呢?

请帮忙,谢谢!

【问题讨论】:

    标签: python python-3.x django django-models


    【解决方案1】:
    class MyModel(models.Model):
        name = models.CharField(max_length=200, unique=True)
        slug = models.SlugField(blank=True, unique=True)
        is_activate = models.BooleanField(default=True)
    
        def __str__(self):
            return self.name
    
        def create_auto_slug(self):
            self.slug = slugify(f'{self.name}-{self.pk}')
    
        def model2save(self):
            MyModel2.objects.create(**your_data)
    
        def save(self, *args, **kwargs):
            self.create_auto_slug()
            super(MyModel, self).save(*args, **kwargs)
            self.model2save()
    

    其他方法 - signals

    【讨论】:

      【解决方案2】:

      你可以这样做:

      form = TeamMemberForm()
      if form.is_valid():
          instance = form.save()
          team = Team.objects.create(name="John")
          instance.members.add(team)
      

      【讨论】:

      • 感谢回复。这些模型的用例通常在管理面板中,所以没有地方可以添加这样的表单。我应该在帖子里说清楚
      • 您可以在 TeamMember post_save 信号中的 team = Team.objects.create(name="John") instance.members.add(team) 中使用这行代码以及。
      • @receiver(post_save, sender=TeamMember) def save_team(sender, instance, **kwargs): 你的代码在这里
      猜你喜欢
      • 2021-12-23
      • 2020-08-02
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多