新的 ManyToManyField object 未添加

New ManyToManyField object is not adding

我正在构建一个 BlogApp,并且我在 ManyToManyField 中制作了 Favorite Users 的一个功能。 这意味着user_1可以在一个字段中添加多个收藏用户。我建立一个视图来添加用户。

但是当我创建一个实例来存储来自管理员的 favorite users,然后再从站点添加 favorite users,然后如果我从站点添加最喜欢的用户,那么他们正在添加。但是,如果管理员中还没有 request.user 的 FavouriteUsers 实例,那么它不会添加和创建新的 object.

因此,用于存储 favorite users of request.user 的新 object 没有添加,如果 object 已经存在,那么他们正在添加。

models.py

class FavoriteUsers(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    favorite_users = models.ManyToManyField(User, related_name='favorite_users', blank=True)

views.py

def AddFavUsers(request,user_id):
    obj = FavoriteUsers.objects.filter(user=request.user)
    user = get_object_or_404(User,id=user_id)

    for ob in obj:
        ob.favorite_users.add(user)
        ob.user.add(request.user)
        ob.save()

    return redirect('home')

Image of already created object

当 object 已经手动创建时,favorite users 正在添加,但如果不是,则新的 object 不会创建。

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

提前致谢。

您的视图基本上是将 user 添加到链接到 User 的所有 FavoriteUser。但是完全没有说有这样的FavoriteUser

因此我们可以构造一个 FavroiteObject 具有:

def AddFavUsers(request,user_id):
    obj = FavoriteUsers.objects.<strong>create(</strong>
        user=request.user
    <strong>)</strong>
    obj.favorite_users.add(user_id)
    # …

建模也有点奇数,因为我们这里创建了第三个table,所以构建一个模型Favorite有两个更有意义ForeignKeys,因此充当连接点 table。所以这应该是这样的:

from django.conf import settings

class Favorite(models.Model):
    user_to = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='favorites_from'
    )
    user_from = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='favorites_to'
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user_from', 'user_to'], name='favorite_only_once')
        ]

如果您想要 user_id 成为登录用户的最爱,您可以使用:

from django.contrib.auth.decorators import login_required

@login_required
def AddFavUsers(request, user_id):
    Favorite.objects.<strong>create(user_from=request.user, user_to_id=user_id)</strong>
    # …

然后您可以通过以下方式获取用户的收藏用户:

User.objects.filter(favorites_from__user_from=<em>my_user</em>)

其中my_user是您要获取收藏用户的用户。


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].

ManyToMany field already handles this. You can add a favorite_users property to your User model, which will point to the User model and Django will create the connecting table. Beware of the symmetrical参数,如果你省略它,它将是一个双向关系。

class MyUser(models.Model):
    ...
    favorite_users = models.ManyToManyField("MyUser", symmetrical=False, blank=True)

如果您还想自己编写连接模型,请查看through参数。