【问题标题】:how to add two ForeignKey(User) in django model如何在 django 模型中添加两​​个 ForeignKey(User)
【发布时间】:2022-07-28 23:10:42
【问题描述】:

我有一个组模型:

class Group(models.Model):
   leader = models.ForeignKey(User, on_delete=models.CASCADE)
   name = models.CharField(max_length=55)
   description = models.TextField()
   joined = models.ManyToManyField(User, blank=True)

我最近添加了leader 将其领导权移交给其他用户的功​​能。这很好,但后来我注意到我的 GroupDetail 模板顶部有一个created by {{group.leader},我认为最好有一个founder 和一个leader,这样人们就可以看到哪个用户创建了集团与当前领导者。

现在我正在努力解决的是如何实现这一点。我假设founder 将与一个用户相关联,也与组的第一个leader 相关联。在某一时刻,两个字段都将是同一个用户。但是我如何在同一个模型中有两个 ForeignKey?或者有没有更好的方法来解决这个问题。

目前更换领导的逻辑是这样的:

<form method="POST">
    {% csrf_token %}
    {{form.as_p}}
    <select id="newLeaderSelect">
    {% for member in group.joined.all %}
        {% if member != group.leader%}
            <option id='newLeader' value={{ member.id }}>{{ member }}</option>
        {% endif %}
    {% endfor %}
    </select>
    <button>CHANGE LEADER</button>
    {{form.errors}}
</form>

<script>
    let leader = document.getElementById('leader')
    let newLeaderSelect = document.getElementById('newLeaderSelect')
    leader.value = newLeaderSelect.value
    
    newLeaderSelect.onchange = () => {
        leader.value = newLeaderSelect.value
    }
</script>

我的看法:

class ChangeLeader(UpdateView):
    model = Group
    form_class = ChangeLeaderForm
    template_name = 'change_leader.html'

    def form_valid(self, form):
        return HttpResponseRedirect(reverse('group_detail', args=[str(group.pk)]))

一切都可以改变领导者,所以我唯一的问题是如何在我的 Group 模型中实现founder?最好的方法是什么?

【问题讨论】:

    标签: django django-models foreign-keys django-model-field


    【解决方案1】:

    您可以将两个 ForeignKey 字段用于同一模型,这只是您的逻辑需要处理 created_by 字段如何更新。保存后信号很容易实现,它还有一个布尔值来判断实例是否刚刚创建:

    class Group(models.Model):
       leader = models.ForeignKey(User, ...
       created_by = models.ForeignKey(User, ...
    
       ...
    
    @receiver(post_save, sender=Group)
    def set_created_by(sender, instance, created, **kwargs):
        if created:
            self.created_by = self.leader 
            self.save()
    

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2015-10-18
      • 2017-12-11
      相关资源
      最近更新 更多