#python #django
Вопрос:
Пожалуйста, помогите мне разобраться в написании тестовой модели для модели книги с внешним ключом. Я работаю над учебником по проекту локальной библиотеки, выполненным MDN. Прямо сейчас это приводит меня к ошибке
Ошибка заключается в следующем
ERROR: setUpClass (catalog.tests.test_models.BookModelTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/rishipalsingh/Projects/notes/mdndjango/venv/lib/python3.9/site-packages/django/test/testcases.py", line 1201, in setUpClass
cls.setUpTestData()
File "/Users/rishipalsingh/Projects/notes/mdndjango/mdn/catalog/tests/test_models.py", line 68, in setUpTestData
Book.objects.create(title='who sold my safari', author=['first_name', 'last_name'], summary='book is about the story of person who found out that his safari is sold', genre='name', Language='name')
File "/Users/rishipalsingh/Projects/notes/mdndjango/venv/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/rishipalsingh/Projects/notes/mdndjango/venv/lib/python3.9/site-packages/django/db/models/query.py", line 451, in create
obj = self.model(**kwargs)
File "/Users/rishipalsingh/Projects/notes/mdndjango/venv/lib/python3.9/site-packages/django/db/models/base.py", line 485, in __init__
_setattr(self, field.name, rel_obj)
File "/Users/rishipalsingh/Projects/notes/mdndjango/venv/lib/python3.9/site-packages/django/db/models/fields/related_descriptors.py", line 215, in __set__
raise ValueError(
ValueError: Cannot assign "['first_name', 'last_name']": "Book.author" must be a "Author" instance.
Код книги для вашей справки выглядит следующим образом
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book')
isbn = models.CharField('ISBN', max_length=13, unique=True,
help_text='13 Character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')
genre = models.ManyToManyField(
Genre, help_text='Select a genre for this book')
language = models.ManyToManyField(
Language, help_text='Select Language for this book')
def get_language(self):
return ', '.join(language.name for language in self.language.all())
get_language.short_description = 'Language'
class Meta:
ordering = ['title', 'author']
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', kwargs= {'pk': str(self.id)})
def display_genre(self):
return ', '.join(genre.name for genre in self.genre.all()[:3])
display_genre.short_description = 'Genre'
Я пишу тест вот так
class BookModelTest(TestCase):
@classmethod
def setUpTestData(cls):
Book.objects.create(title='who sold my safari', author=['first_name', 'last_name'], summary='book is about the story of person who found out that his safari is sold', genre='name', Language='name')
def test_title_label(self):
book = Book.objects.get(id=1)
field_label = book._meta.get_field('title').verbose_name
self.assertEqual(field_label, 'title')
Спасибо Вам за помощь
Комментарии:
1.
author
,language
иgenre
являются связанными полями объектов, но вы передаете строки и списки в эти поля. вы должны прочитать, как создавать связанные объекты здесь: docs.djangoproject.com/en/3.2/ref/models/relations