Проблемы с сохранением объекта Django ORM с отношением "многие к одному" - PullRequest
1 голос
/ 05 ноября 2019

У меня есть эта модель:

class Answer(models.Model):
    order = models.IntegerField()
    question_key = models.IntegerField()
    answer_index = models.IntegerField()
    user_session = models.ForeignKey(
        UserSession, on_delete=models.CASCADE, related_name="answers"
    )

user_session не может быть None, и я бы хотел, чтобы так было.

Вот как я пытаюсьсохранить Answer объект:

    answer = Answer(
        question_key=question_key,
        answer_index=answer_index,
        user_session=user_session,
        order=answer_order,
    )
    answer.save()

Но я получаю ошибку: ValueError: save() prohibited to prevent data loss due to unsaved related object 'user_session'.

Мои исследования показывают, что мне нужно сохранить объект ответа до добавления user_session вЭто. Тем не менее, я не могу этого сделать, если я хотел бы сохранить ненулевое ограничение для модели ответа.

Есть ли лучший способ решить эту проблему или я должен просто позволить Answer.user_session быть обнуляемым?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

Эта ошибка не о несохраненном ответе, а о несохраненном сеансе пользователя. Вам нужно сохранить все связанные объекты (в данном случае это user_session) перед тем, как ссылаться на него в других объектах как на внешний ключ, потому что на объект нельзя ссылаться, если у него нет идентификатора (и он не имеет его до тех пор, пока он не сохранен в базе данных).

1 голос
/ 05 ноября 2019

Вы не сохранили объект UserSession (user_session), следовательно, ошибка;это отношение «многие к одному», поэтому вы можете напрямую использовать объект UserSession в качестве значения поля user_session при создании экземпляра Answer.

. Сначала сохраните объект UserSession изатем обратитесь к нему непосредственно в Answer экземпляре модели.

Например:

user_session.save()

answer = Answer(
    question_key=question_key,
    answer_index=answer_index,
    user_session=user_session,
    order=answer_order,
)
answer.save()

Кроме того, вы ничего не делаете после создания экземпляра Answer, поэтому вы можете использовать create напрямую:

answer = Answer.objects.create(
    question_key=question_key,
    answer_index=answer_index,
    user_session=user_session,
    order=answer_order,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...