Nano Hash - криптовалюты, майнинг, программирование

Сохранение данных формы в поля models.ForeignKey

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

valueError: Cannot assign "'scifi'": "Book.genre" must be a "Genre" instance. 

Есть ли способ назначить данные из отправленной формы модели models.ForeignKey(Genre,on_delete=models.CASCADE,null=True), которая находится в классе Book.

модели.py

class Genre(models.Model):
    title=models.CharField(max_length=100)
    class Meta:
        verbose_name_plural='2. Genre'
    def __str__(self):
        return self.title


class Language(models.Model):
    title=models.CharField(max_length=100)
    class Meta:
        verbose_name_plural='3. Language'
    def __str__(self):
        return self.title

class Book(models.Model):
    image=models.ImageField(upload_to="book_imgs/",null=True)
    title=models.CharField(max_length=200,null=True)
    Author=models.CharField(max_length=200,null=True)
    genre=models.ForeignKey(Genre,on_delete=models.CASCADE,null=True)
    language=models.ForeignKey(Language,on_delete=models.CASCADE,null=True)


    class Meta:
        verbose_name_plural='1. Book'

    def __str__(self):
        return self.title

    def image_tag(self):
        return mark_safe('<img src="%s" width="50" height="50" />' % (self.image.url))

просмотры.py

def add_books(request):
    if request.method =="POST":
        bookname= request.POST['bookname']
        author= request.POST['author']
        genre= request.POST['genre']
        language= request.POST['language']
        instance = Book(title=bookname,Author=author,genre=genre,language=language)
        instance.save()      
        
    return render(request,'Add_books.html')


Ответы:


1

что ты делаешь не так

genre= request.POST['genre']

приведенный выше код дает вам строковое значение, а

instance = Book(title=bookname,Author=author,genre=genre,language=language)

жанр принимает объект модели

сделай это вместо

genre = Genre.objects.get(title = reqeust.POST['genre'])

а потом

instance=Book(title=bookname,Author=author,genre=genre,language=language)
07.07.2021

2

Просто разрешите жанр его экземпляру:

    instance = Book(
        title=bookname,
        Author=author,
        genre=Genre.objects.get(title=genre),
        language=language
    )

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

Тем не менее, .get вызовет исключение DoesNotExist, если нет жанра, поэтому вы можете сделать:

genre = Genre.objects.get_or_create(title=genre) вместо

07.07.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..