Pytest Fixture seeing Прямое назначение на прямую сторону множества "многие ко многим" запрещено
Не уверен, почему я получаю эту ошибку при запуске моего pytest
с приспособлением. Я совсем новичок в этом деле, поэтому не совсем уверен, как отлаживать это
TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use tags.set() instead.
Ошибка
Factory
from addresses.models import Address
from factories.account import UserFactory
from factories.tag import TagFactory
import factory
from faker import Faker
fake = Faker()
class AddressFactory(factory.django.DjangoModelFactory):
class Meta:
model = Address
address = f"0x{fake.ean(length=13)}" # ean is fake license plate
slug = address
blockchain = fake.cryptocurrency_name()
created_by = factory.SubFactory(UserFactory)
modified_by = factory.SubFactory(UserFactory)
public = fake.pybool() # random True/False
tags = factory.SubFactory(TagFactory)
Тест
import pytest
from .models import Address
def test_new_address(address_factory: Address):
address = address_factory.build()
print(address)
assert True
conftest.py
from addresses.models import Address
from tags.models import Tag
from accounts.models import User
from factories import UserFactory, TagFactory, AddressFactory
import pytest
from pytest_factoryboy import register
register(TagFactory) # tag_factory
register(AddressFactory) # address_factory
register(UserFactory) # user_factory
@pytest.fixture
def new_tag(db, tag_factory) -> Tag:
return tag_factory.create() # Save user to test database
@pytest.fixture
def new_address(db, address_factory) -> Address:
return address_factory.create() # Save user to test database
@pytest.fixture
def new_user(db, user_factory) -> User:
user = user_factory.create() # Save user to test database
return user
Модели
from django.db import models
from accounts.models import User
from tags.models import Tag
class Address(models.Model):
address = models.CharField(max_length=255)
blockchain = models.CharField(max_length=255)
slug = models.SlugField(
max_length=255
) # unique identifier for Address instead of using ID
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="created_by"
)
modified_by = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="modified_by"
)
public = models.BooleanField(default=False)
tags = models.ManyToManyField(
Tag, related_name="addresses"
) # related_name set so you can call tag.addresses.all() instead of tag.address_set.all()
def __str__(self):
return self.address
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
def __str__(self):
return self.name