Search code examples
pythondjangodjango-modelsmany-to-many

How to access User Profile's friends in ManyToMany field


I am building a simple social media app. AND i am trying to build a feature of adding users into post using ManyToManyField.

I am trying to access profile friends in Post's model instance "add_user" for tagging user.

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,default='',unique=True)
    full_name = models.CharField(max_length=100,default='')
    friends = models.ManyToManyField("Profile",blank=True)

class Post(models.Model):
    post_owner = models.ForeignKey(User,default='',null=True,on_delete = models.CASCADE)
    post_title = models.CharField(max_length=500,default='')
    add_user = models.ManyToManyField(User.profile.friends.all())

I am new in django and I have no idea how can i access user's friend in Post's model instance.

Any help would be much Appreciated.

Thank You in Advance.


Solution

  • You can't give a queryset as an argument for a ManyToManyField, just a class name.

    add_users = models.ManyToManyField(User.profile.friends.all()) # you can't do this.
    
    add_users = models.ManyToManyField(User) # Do this.
    

    You shouldn't place you logic in your model's definition. Do that in your views.

    EDIT: I suggest you use a ModelChoiceField and do the filtering logic there:

    class AddFriendForm(forms.Form):
        def __init__(self, *args, **kwargs):
            try:
                user = kwargs.pop('user')
            except:
                user = None
            super(AddFriendForm, self).__init__(*args, **kwargs)
            self.fields['friend'].queryset = user.profile.friends.all()
    
        friend = forms.ModelChoiceField(queryset=User.objects.none()) 
    

    And then in your view you initialize it like this:

    def your_view(request):
        form = AddFriendForm(user=request.user)