【问题标题】:New ManyToManyField object is not adding未添加新的 ManyToManyField 对象
【发布时间】:2021-09-18 15:22:27
【问题描述】:

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

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

因此,用于存储request.user 的favorite users 的新对象未添加,如果对象已经存在,则它们正在添加。

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

当对象已经存在时,手动创建然后favorite users 正在添加,但如果不是,则不会创建新对象。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • obj 将返回一个FavoriteUsers 对象,前提是该对象链接到request.user,换句话说,您正在添加之前已经添加的用户。
  • 我也不太清楚你为什么首先使用ManyToManyField,看起来Favorite关系应该是@之间的连接模型 987654338@ 和 User。
  • 如果你想创建一个FavoriteUsers,你使用FavoriteUsers.objects.create(user=reque.ust)
  • For first comment :- 那么我怎样才能用新的request.user 创建一个新的object 呢? For second comment :- 我应该使用 profile 而不是 user 吗?
  • @WillemVanOnsem,当我使用create 时,它只创建对象但不添加用户,然后我又试了一次,然后它说:- 重复键值违反唯一约束“ auth_user_pkey" DETAIL: Key (id)=(16) already exists. 然后我用get_or_create 然后它显示'tuple'对象没有属性'favorite_users'

标签: python django django-models django-views many-to-many


【解决方案1】:

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

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

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

建模也有点奇怪,因为我们在这里创建了第三个表,所以用两个ForeignKeys 构造一个模型Favorite 更有意义,从而充当连接表.所以这应该是这样的:

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.create(user_from=request.user, user_to_id=user_id)
    # …

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

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

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


注意:您可以使用 @login_required decorator [Django-doc].

【讨论】:

  • 如果request.user 在某人的最爱用户中,我如何访问?假设我是另一个用户的最爱用户,那么如何知道我是否是另一个用户的最爱用户?
  • 我不能用我以前的方法吗?请
  • @Van:以前的方法会导致数据重复,数据库大,查询效率低。你可以用第二种方法检查request.user是否在某人的收藏夹中if someone in User.objects.filter(favorites_from__user_from=request.user)
  • 给我一些时间来检查所有这些并实施,我一定会标记它。
  • 最后一个问题,假设有 two users User_1 和 User_2 并且如果用户 User_2 添加了 User_1作为收藏用户,则没有人可以将User_1 添加为收藏。如果一个用户被添加到某人最喜欢的用户中然后另一个用户可以添加某人添加的用户怎么办?
【解决方案2】:

ManyToMany 字段已处理此问题。您可以将 favorite_users 属性添加到您的 User 模型中,该属性将指向 User 模型并且 Django 将创建连接表。请注意symmetrical 参数,如果您忽略它,它将是一个双向关系。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2011-02-15
    • 2014-02-21
    • 2021-10-30
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多