【问题标题】:create() takes 1 positional argument but 2 were given?create() 接受 1 个位置参数但给出了 2 个?
【发布时间】:2018-11-15 17:33:17
【问题描述】:

我有一个名为 Follow 的模型,其中包含以下字段:

class Following(models.Model):
    target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE)
    follower = models.ForeignKey('User', related_name='targets', on_delete=models.CASCADE)

    def __str__(self):
        return '{} is followed by {}'.format(self.target, self.follower)

我要创建的是一个关注按钮,当按下该按钮时,会给目标一个关注者。在具有关注按钮的视图内部,具有以下逻辑:

class ProfileView(DetailView):
    model = User
    slug_field = 'username'
    template_name = 'oauth/profile.html'
    context_object_name = 'user_profile' # Without this, Django would default to request.user instead which is the logged in user

    def post(self, request, slug):
        follower = self.request.user

        self.object = self.get_object()
        context = self.get_context_data(object=self.object)

        follow_unfollow(follower, self.object.id)  # Error is found inside this function
        return render(request, self.template_name, context=context)

def follow_unfollow(follower, id):
    target = get_object_or_404(User, id=id)

    if follower.is_authenticated():
        if follower in target.followers.all():
            target.followers.delete(follower)

        else:
            target.followers.create(follower)  # Error outputs: create() takes 1 positional argument but 2 were given

当我们想为新的关注者创建一行时,会发生错误,提示 create() takes 1 positional argument but 2 were given 我在做什么错?

【问题讨论】:

    标签: python django


    【解决方案1】:

    您需要将关键字参数传递给create() 方法:

    target.followers.create(follower=follower)
    

    或者您可以使用add() 方法代替:

    target.followers.add(follower)
    

    也应该是remove 而不是delete

    target.followers.remove(follower)
    

    【讨论】:

    • 由于某种原因,当我执行 add 方法时,我收到此错误:'Following' instance expected, got <SimpleLazyObject: <User: john>> 但是当我使用 create 时,它​​可以工作。另外,当我使用 remove 时,我收到一个 IDE 错误,上面写着:method remove does not exist on manager when foreign key does not allow nulls
    • @user2896120 哦,对不起。 add() 仅适用于普通的多线程字段。要使用remove,请尝试将null=True 添加到外键:target = models.ForeignKey('User', related_name='followers', on_delete=models.CASCADE, null=True)
    • 嗯,由于某种原因,这个 if 语句不正确,即使它应该是 if follower in target.followers.all():
    • @user2896120 target.followersFollowing 实例。您需要按照@Lemayzeur 的建议检查target.followers.filter(follower=follower)
    • 我看到它现在可以正常工作了,但是,在我点击按钮后页面没有重新加载正确的信息,我必须重新加载两次才能看到更新的结果。这是因为我传递了一个过时的上下文对象。我将self.get_object()context 行放在follow_unfollow 方法下面以获取更新的上下文对象,但是,如何在不重复代码的情况下为follow_unfollow 方法获取self.object.id
    【解决方案2】:

    你在获取 User 实例时错过了一些观点,实际上,你需要删除 Following 实例以防它存在,试试这个:

    def follow_unfollow(follower, id):
        target = get_object_or_404(User, id=id)
    
        if follower.is_authenticated():
            following = target.followers.filter(follower=follower)
            if following.exists():
                following.delete()
            else:
                # target.followers.create(follower=follower,target=target) 
                Following.objects.create(follower=follower,target=target)
    

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 2019-03-12
      • 2016-10-13
      • 2019-04-20
      • 2014-07-19
      • 2016-08-09
      • 2020-01-30
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多