2017-05-28 3 views
0

Question/Problème:

Je construis une application Django, avec 2 modèles: User et Secret. Les utilisateurs peuvent créer des secrets et d'autres utilisateurs peuvent les "aimer". J'ai configuré mon champ likes en tant que ManyToManyField, de sorte que les utilisateurs qui aiment un secret peuvent être stockés là et plus tard récupérés, etc. Cependant, quand j'essaye de rechercher un utilisateur et un secret et utilise my_secret.likes.add(my_User)rien n'arrive. Je ne reçois pas d'erreur et lorsque j'imprime le champ many-to-manylikes de mon Secret, après l'ajout, je vois: secrets.User.None.Pourquoi la méthode `add()` de Django dans mes modèles `many-to-many` ne prend-elle pas?

Pourquoi ma méthode add() est-elle en cours d'exécution mais je ne reçois aucune erreur, et pourquoi mon utilisateur n'est-il pas correctement ajouté aux préférences de mon Secret?

Remarque: J'ai enregistré les objets Utilisateur et Secret lors de la création initiale. En dehors de cette application, j'ai pu utiliser la méthode add() très bien, mais dans ces scénarios, je créais des objets dans le moment, et ne récupérait pas les objets déjà existants.

Existe-t-il une manière différente de gérer add() lors de l'utilisation de données récupérées à partir d'une requête? C'est mon seul autre raisonnement en ce moment, et j'ai suivi la documentation ici exactement: Django Many-to-Many Docs

Je m'excuse également si cela a été répondu ailleurs sur le site. J'ai trouvé un other post here, mais il n'y avait aucune solution fournie, étant donné qu'ils éprouvaient exactement le même problème.

Mes modèles:

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. 

Problème Exemple:

Le modèle émigre bien, tout semble être dans la syntaxe appropriée. Toutefois, lorsque j'essaie de récupérer un User et un Secret et d'ajouter le User au Secret.likes, la méthode add() ne génère aucune erreur, s'exécute, mais aucun objet n'est enregistré.

Voici un exemple:

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? 

Pourquoi lors de l'impression my_secret.likes ci-dessus, est rien imprimé?

Surtout quand: tim.secret_set.all() montre le secret contenant un id=2 comme dans l'exemple ci-dessus .... de sorte que le User est l'enregistrement de la relation avec le Secret, mais le Secret n'enregistre aucun rapport avec le User. Qu'est-ce que je fais mal?

+0

essayer '' append' ou update' au lieu d'ajouter de – hansTheFranz

+0

@hansTheFranz I J'apprécie vraiment que tu essaies de m'aider.J'ai essayé juste en utilisant 'append()' à la place de 'add()', et j'ai reçu cette erreur: 'AttributeError: l'objet 'ManyRelatedManager' n'a pas d'attribut 'append''. J'ai aussi essayé d'utiliser 'update()' et j'ai reçu cette erreur: 'TypeError: update() prend exactement 1 argument (2 donnés)'. Utilisez exactement la même mise en forme que dans mon article, il suffit de remplacer la méthode add par celles que vous avez décrites! Malheureusement encore en train de se battre ici! – natureminded

Répondre

3

Vous devez appel la méthode all du nombre à plusieurs champs pour voir tous objets liés:

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

.... Mon ami, les heures que je me suis tourmenté pour ce LOL, vous êtes un ange du ciel avec un message de vérité! Cela a fonctionné et c'est exactement ce qui me manquait! Se sentir ridicule pour la façon dont j'ai raté quelque chose de si basique, et MERCI tellement! Je vous donnerais + 1^10000 si je pouvais !!! – natureminded