How to define ManyToManyField in Django for tests

To test my serializers in django rest framework I use Model Name.objects.create method to create fields. But I can’t create ManyToManyField.

Guess, firstly I need to create objects for first model and for second model otherwise ManyToManyField bound can’t be created. But still can’t define ManyToManyField for test with create method.

Please help me to realize how it should work correctly. I’ve red django documentation, but haven’t got how to solve my issue.
Here is my code example:

models.py

class Book(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=7, decimal_places=2)
    author_name = models.CharField(max_length=200)
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='my_books')
    readers = models.ManyToManyField(User, through='UserBookRelation', related_name='books')

test.py

class BookSerializerTestCase(TestCase):

    def setUp(self):
        self.user = User.objects.create(username='test_username')
        self.book_1 = Book.objects.create(name='Test book 1', price=750, author_name='Author 1', owner=self.user)
        self.book_2 = Book.objects.create(name='Test book 2', price=650, author_name='Author 1', owner=self.user)

    def test_readers(self):
        users = [self.user]
        reader = self.book_1.readers.set(users)
        print(f'Readers: {reader}')

readers is None, how to define self.user?

Thank you in advance.

>Solution :

I think the command is correct. You can define ManyToMany using set and modify using add, remove.
You can also use just ids of them like the following.

self.book_1.readers.set([self.user.id])
self.book_1.readers.add(1)
self.book_1.readers.remove(1)

Leave a Reply