Проблема с фабрикой django для GenericForeignKey
models.py
class GoogleCreative(models.Model):
name = models.CharField
creative_type = models.CharField
url = models.URLField
table_url = models.URLField
status = models.CharField
tags = GenericRelation(
'CreativeTag', object_id_field='creative_id', content_type_field='creative_content_type'
)
class Tag(models.Model):
name = models.CharField(max_length=150)
slug = models.SlugField(max_length=150, allow_unicode=True)
class CreativeTag(models.Model):
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
creative_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
creative_id = models.PositiveIntegerField()
creative = GenericForeignKey('creative_content_type', 'creative_id')
class Meta:
unique_together = ['tag', 'creative_content_type', 'creative_id']
factories.py
class GoogleCreativeFactory(factory.django.DjangoModelFactory):
class Meta:
model = GoogleCreative
name = factory.Faker('word')
.....
class TagFactory(factory.django.DjangoModelFactory):
class Meta:
model = Tag
django_get_or_create = ('name',)
slug = factory.LazyAttribute(lambda o: slugify(o.name, allow_unicode=True))
class CreativeTagFactory(factory.django.DjangoModelFactory):
class Meta:
model = CreativeTag
exclude = ['creative']
class Params:
name = factory.Sequence(lambda n: f'tag {n}')
tag = factory.SubFactory(TagFactory, name=factory.SelfAttribute('..name'))
creative_id = factory.SelfAttribute('creative.id')
creative_content_type = factory.SelfAttribute('creative.content_type')
test.py
@pytest.mark.django_db
def test_tags_removed(google_creative_factory, creative_tag_factory, user):
creative = google_creative_factory()
creative_tag_factory(creative=creative, name='Big Fish')
Но получаем ошибку
AttributeError: 'GoogleCreative' object has no attribute 'content_type'
Я пытаюсь решить эту проблему, добавляя новое поле creative
в CreativeTagFactory и комментарий Meta exclude field
class CreativeTagFactory(factory.django.DjangoModelFactory):
class Meta:
model = CreativeTag
# exclude = ['creative']
class Params:
name = factory.Sequence(lambda n: f'tag {n}')
tag = factory.SubFactory(TagFactory, name=factory.SelfAttribute('..name'))
creative_id = factory.SelfAttribute('creative.id')
creative_content_type = factory.SelfAttribute('creative.content_type')
creative = factory.SubFactory(GoogleCreativeFactory)
Но получил ту же ошибку