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



问题/问题:

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

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

注意:我在初始创建时保存了用户和机密对象。在此应用程序之外,我已经能够很好地使用add()方法,但在这些情况下,我正在创建对象,而不是检索已经存在的对象。

使用从查询检索的数据时,是否有其他方法来处理add()?这是我目前唯一的其他推理路线,我完全遵循了这里的文档:Django 多对多文档

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

我的模型:

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.

问题示例:

该模型迁移正常,一切似乎都采用正确的语法。但是,当我尝试检索UserSecret,并将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?

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

特别是当:tim.secret_set.all()显示了包含id=2的密钥,如上例所示。所以User记录的是与Secret的关系,但Secret没有记录与User的任何关系。我做错了什么?

需要调用多对多字段的all方法查看所有相关对象:

print my_secret.likes.all()
#                     ^^^^^

最新更新