如何在 ManyToMany 字段中访问用户配置文件的朋友

How to access User Profile's friends in ManyToMany field

我正在构建一个简单的社交媒体应用程序。我正在尝试使用 ManyToManyField.

构建将用户添加到 post 的功能

我正在尝试访问 Post's model instance "add_user" 中的 profile friends 以标记用户。

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())

我是 django 的新手,我不知道如何在 Post 的模型实例中访问 user's friend

如有任何帮助,我们将不胜感激。

提前致谢。

你做不到

add_users = models.ManyToManyField(User.profile.friends.all())`

因为模型被评估一次,并且需要是非可变值

您需要做的事情:

add_user = models.ManyToManyField("Profile",blank=True)

别忘了添加您的 ManyToManyField:

related_name="XXX", null=True

您不能将查询集作为 ManyToManyField 的参数,只是一个 class 名称。

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

add_users = models.ManyToManyField(User) # Do this.

您不应该将逻辑放在模型的定义中。 按照你的看法去做。

编辑: 我建议您使用 ModelChoiceField 并在那里执行过滤逻辑:

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()) 

然后在您看来,您可以这样初始化它:

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