为什么在Django的`many-to-many` Django模型中,Django的`add()`方法没有使用?
问题/问题:
我建立一个Django应用程序,有2种型号:User
和Secret
。用户可以制作秘密,其他用户可以“喜欢”它们。我已经将我的likes
字段设置为ManyToManyField
,以便像秘密的用户可以存储在那里并稍后检索等。但是,当我尝试查询用户和秘密并使用my_secret.likes.add(my_User)
时没有任何反应。我没有收到错误,当我打印我的秘密的many-to-many
likes
字段后,添加,我看到:secrets.User.None
。为什么在Django的`many-to-many` Django模型中,Django的`add()`方法没有使用?
为什么我的add()
方法正在运行,但我没有收到任何错误,为什么我的用户没有正确添加到我的秘密的喜欢?
注意:我在初始创建时保存了User和Secret对象。在这个应用程序之外,我已经能够很好地使用add()
方法,但在那些场景中,我正在创建对象,而不是检索已存在的对象。
使用从Query中检索的数据时,有没有不同的方法来处理add()
?这是我现在唯一的其他推理,我完全按照这里的文档:Django Many-to-Many Docs
我也很抱歉,如果这是在网站上的其他地方回答。我确实找到了一个other post here,但没有提供任何解决方案,因为他们遇到了完全相同的问题。
我的模型:
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.
问题举例:
模型迁移罚款,一切似乎是在正确的语法。但是,当我尝试检索User
和Secret
,并将User
添加到Secret.likes
时,add()
方法不提供任何错误,运行但未保存对象。
下面是一个例子:
tim = User.objects.get(email="[email protected]") # 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()
# ^^^^^
....我的朋友,我为这个恶魔而折磨自己的时间,你是一个天使,有真理的信息!这工作,正是我错过了!感到愚蠢的是我错过了这么基本的东西,并且非常感谢!如果我可以的话,会给你+ 1^10000! – natureminded
尝试'append'或'update'而不是关闭添加 – hansTheFranz
@hansTheFranz我非常感谢你试图帮助我。我刚刚尝试使用'append()'代替'add()',并接收到此错误:'AttributeError:'ManyRelatedManager'对象没有属性'append''。我也尝试使用'update()'并收到这个错误:'TypeError:update()只需要1个参数(2给定)'。使用与我的帖子完全相同的格式,只需用您描述的添加方法替换即可!不幸的是仍然在这里作战! – natureminded