为什么在Django的`many-to-many` Django模型中,Django的`add()`方法没有使用?

为什么在Django的`many-to-many` Django模型中,Django的`add()`方法没有使用?

问题描述:

问题/问题:

我建立一个Django应用程序,有2种型号:UserSecret。用户可以制作秘密,其他用户可以“喜欢”它们。我已经将我的likes字段设置为ManyToManyField,以便像秘密的用户可以存储在那里并稍后检索等。但是,当我尝试查询用户和秘密并使用my_secret.likes.add(my_User)没有任何反应。我没有收到错误,当我打印我的秘密的many-to-manylikes字段后,添加,我看到: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. 

问题举例:

模型迁移罚款,一切似乎是在正确的语法。但是,当我尝试检索UserSecret,并将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任何关系。我究竟做错了什么?

+0

尝试'append'或'update'而不是关闭添加 – hansTheFranz

+0

@hansTheFranz我非常感谢你试图帮助我。我刚刚尝试使用'append()'代替'add()',并接收到此错误:'AttributeError:'ManyRelatedManager'对象没有属性'append''。我也尝试使用'update()'并收到这个错误:'TypeError:update()只需要1个参数(2给定)'。使用与我的帖子完全相同的格式,只需用您描述的添加方法替换即可!不幸的是仍然在这里作战! – natureminded

您需要呼叫all方法多到许多领域,查看所有相关对象:

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

....我的朋友,我为这个恶魔而折磨自己的时间,你是一个天使,有真理的信息!这工作,正是我错过了!感到愚蠢的是我错过了这么基本的东西,并且非常感谢!如果我可以的话,会给你+ 1^10000! – natureminded