代码之家  ›  专栏  ›  技术社区  ›  Samir Tendulkar

django上的用户跟随模型。不能对指定中介模型的ManyToManyField使用add()。使用帐户。请改用联系人的经理

  •  2
  • Samir Tendulkar  · 技术社区  · 8 年前

    我是django的新手,请原谅我在代码或逻辑上犯的愚蠢错误,

    简介: 我试图在django中创建一个用户跟随模型。用户可以在其中跟踪和展开网站上的其他用户

    错误: 我已经做了 models 为了我的跟随/展开我也做了 views 我发现了这个错误

    AttributeError at /accounts/admin/follow/
    Cannot use add() on a ManyToManyField which specifies an intermediary model. Use accounts.Contact's Manager instead. 
    

    这个 obj.followers.add(user) 在回溯中突出显示为错误的来源

    下面是我的 模型.py

    from django.contrib.auth.models import User
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        city = models.CharField(max_length=100)
        country = models.CharField(max_length=100)
        def get_absolute_url(self):
            return reverse('accounts:profile', kwargs={'username': self.user.username})
    
    class Contact(models.Model):
        user_from = models.ForeignKey(User, related_name='suppporter')
        user_to = models.ForeignKey(User, related_name='leader')
    
        def __str__(self):
            return '{} follows {}'.format(self.user_from, self.user_to)
    
    
    User.add_to_class('following',
                      models.ManyToManyField('self', through=Contact, related_name='followers', symmetrical=False))
    

    我觉得models.py可能不错。我认为错误在于我的观点。 下面是我的 视图.py

    class FollowToggle(LoginRequiredMixin, RedirectView):
    
        def get_redirect_url(self, *args, **kwargs):
            username = self.kwargs.get('username')
            print(username + " This is the user who will be followed") # This prints correct
            profile = get_object_or_404(Profile, user__username=username)
            print(profile) # This prints correct
            obj = get_object_or_404(User, username=username)
            print(obj) # This prints correct
            url_ = profile.get_absolute_url()
            print(url_) # This prints correct
            user = self.request.user
            print(user) # This prints correct
            if user.is_authenticated():
                if user in obj.followers.all(): # I know this is the source of the error.
                    obj.followers.remove(user)
                else:
                    obj.followers.add(user)
            return url_
    

    下面是 网址.py 以防万一

    url(r'^(?P<username>[-\w]+)/follow/$', views.FollowToggle.as_view(), name='follow'),
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   neverwalkaloner    8 年前

    你不能使用 add remove 通过第三个模型定义多人关系的方法。从 docs :

    与通常的多对多字段不同,您不能使用add()、create()或set()来创建关系

    相反,你应该使用 Contact 经理:

    if user.is_authenticated():
        if user in obj.followers.all(): # I know this is the source of the error.
            Contact.objects.filter(user_to=obj, user_from=user).delete()
        else:
            Contact.objects.create(user_to=obj, user_from=user)
    
        2
  •  1
  •   M MD    7 年前

    在django 2.2中,您可以使用 add , remove set 方法( Docs )

    您也可以使用add()、create()或set()来创建关系,只要您为任何必需的字段指定through\u默认值