为什么在我的“多对多”Django 模型中没有采用 Django 的“add()”方法?

twk*_*nab 0 python django many-to-many django-orm manytomanyfield

问题/问题:

我正在构建一个 Django 应用程序,有 2 个模型:UserSecret. 秘密可以由用户制作,其他用户可以“喜欢”它们。我已将我的likes字段设置为 a ManyToManyField,以便喜欢 Secret 的 Users 可以存储在那里并稍后检索等。但是,当我尝试查询 User 和 Secret 并使用时my_secret.likes.add(my_User) 什么也没有发生。我没有收到错误消息,当我打印我的 Secretmany-to-many likes字段时,添加后,我看到:secrets.User.None.

为什么我的add()方法正在运行,但我没有收到任何错误,为什么我的用户没有正确添加到我的 Secret 的赞中?

注意:我在最初创建时保存了 User 和 Secret 对象。在这个应用程序之外,我已经能够add()很好地使用该方法,但在那些场景中,我正在创建对象,而不是检索已经存在的对象。

add()使用从查询中检索到的数据时是否有不同的处理方式?这是我现在唯一的其他推理方式,我完全按照此处的文档进行操作:Django Many-to-Many Docs

如果在网站的其他地方回答了这个问题,我也深表歉意。我确实在这里找到了一篇文章,但没有提供解决方案,因为他们遇到了完全相同的问题。

我的模型:

class User(models.Model):
    """
    Creates instances of a `User`.

    Parameters:
    -`models.Model` - Django's `models.Model` method allows us to create new models.
    """

    first_name = models.CharField(max_length=50) # CharField is field type for characters
    last_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)
    password = models.CharField(max_length=22)
    created_at = models.DateTimeField(auto_now_add=True) # DateTimeField is field type for date and time
    updated_at = models.DateTimeField(auto_now=True) # note the `auto_now=True` parameter
    objects = UserManager() # Attaches `UserManager` methods to our `User.objects` object.

class Secret(models.Model):
    """
    Creates instances of a `Secret`.

    Parameters:
    -`models.Model` - Django's `models.Model` method allows us to create new models.
    """

    description = models.CharField(max_length=100) # CharField is field type for characters
    user = models.ForeignKey(User, related_name="secrets") # One-to-Many Relationship
    likes = models.ManyToManyField(User) # Many to Many Relationship
    created_at = models.DateTimeField(auto_now_add=True) # DateTimeField is field type for date and time
    updated_at = models.DateTimeField(auto_now=True) # note the `auto_now=True` parameter
    objects = SecretManager() # Attaches `SecretManager` methods to our `Secret.objects` object.
Run Code Online (Sandbox Code Playgroud)

问题示例:

模型迁移良好,一切似乎都在正确的语法中。但是,当我尝试检索 aUser和 aSecret并将User加到 时Secret.likes,该add()方法没有给出错误,运行,但没有保存任何对象。

下面是一个例子:

tim = User.objects.get(email="tim@tim.com") # Gets a user object
my_secret = Secret.objects.get(id=2) # Gets a secret object
# This is where nothing seems to happen / take:
my_secret.likes.add(tim) # add() method per Django many-to-many docs
print my_secret.likes # returns: `secrets.User.None` -- why?
Run Code Online (Sandbox Code Playgroud)

为什么在my_secret.likes上面打印时,什么都不打印?

特别是当:tim.secret_set.all()显示包含id=2上面示例中的秘密时 ......所以User记录与 的关系Secret,但未Secret记录与 的任何关系User。我究竟做错了什么?

Mos*_*oye 5

您需要调用all 许多一对多现场查看的方法,所有相关的对象:

print my_secret.likes.all()
#                     ^^^^^
Run Code Online (Sandbox Code Playgroud)

  • ....我的朋友,我为这个 LOL 折磨自己的时间,你是来自天空的天使,传递着真理的信息!这很有效,这正是我所缺少的!为我错过如此基本的东西而感到愚蠢,非常感谢您!!如果可以,我会给你+1^10000!!! (2认同)