Как написать тест с помощью иностранного/manytomany ключа — Django

#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