Почему метод Django add () в моих моделях Django «многие ко многим» не работает?

Вопрос/проблема:

Я создаю приложение Django с двумя моделями: User и Secret. Секреты могут создаваться пользователями, и другие пользователи могут их «лайкать». Я настроил свое поле likes как ManyToManyField, чтобы пользователи, которым нравится секрет, могли храниться там, а затем извлекаться и т. д. Однако, когда я пытаюсь запросить пользователя и секрет и использовать my_secret.likes.add(my_User) ничего не происходит< /эм>. Я не получаю сообщение об ошибке, и когда я печатаю поле many-to-many likes моего секрета, после добавления я вижу: secrets.User.None.

Почему мой метод add() работает, но я не получаю никаких ошибок, и почему мой пользователь не добавляется должным образом в лайки моего секрета?

Примечание. Я сохранил объекты User и Secret при первоначальном создании. Вне этого приложения я мог прекрасно использовать метод add(), но в этих сценариях я создавал объекты в данный момент, а не извлекал уже существующие объекты.

Есть ли другой способ обработки add() при использовании данных, полученных из запроса? Это моя единственная другая линия рассуждений прямо сейчас, и я точно следовал документации здесь: Документы Django Many-to-Many

Я также извиняюсь, если на этот вопрос был дан ответ в другом месте сайта. Я нашел один другой пост здесь, но не было решение предоставлено, при условии, что они столкнулись с точно такой же проблемой.

Мои модели:

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. Что я делаю неправильно?


person twknab    schedule 28.05.2017    source источник
comment
попробуйте append или update вместо выкл добавить   -  person hansTheFranz    schedule 28.05.2017
comment
@hansTheFranz Я очень ценю, что ты пытаешься мне помочь. Я только что попытался использовать append() вместо add() и получил эту ошибку: AttributeError: 'ManyRelatedManager' object has no attribute 'append'. Я также пытался использовать update() и получил эту ошибку: TypeError: update() takes exactly 1 argument (2 given). Используйте точно такое же форматирование, как и в моем посте, только замените метод add на описанный вами! К сожалению, все еще боремся здесь!   -  person twknab    schedule 28.05.2017


Ответы (1)


Вам нужно вызвать метод all поля "многие ко многим", чтобы просмотреть все связанные объекты:

print my_secret.likes.all()
#                     ^^^^^
person Moses Koledoye    schedule 28.05.2017
comment
....Мой друг, сколько часов я мучил себя из-за этого LOL, ты ангел с небес с посланием истины! Это сработало, и это именно то, чего мне не хватало! Чувствую себя глупо из-за того, что я пропустил что-то такое простое, и большое СПАСИБО!! Дал бы вам +1^10000, если бы мог!!! - person twknab; 28.05.2017