我正在构建三个Django模型,允许用户创建表示他们想要参加的活动(例如电影,音乐会和体育赛事)的项目列表。由于每个用户可以在列表中包含一个或多个项目(即活动),并且多个用户可能在其中一个列表中具有相同的项目(活动),因此列表和项目之间存在多对多关系:
'list_type'表是外键查找表,用于标识列表中存储的活动项目(电影等)的类型。当我运行创建表的初始迁移时,我通过Django迁移预填充此表。
# list/models.py
class ListType(models.Model):
LIST_TYPES = (
(1, 'Movie'),
(2, 'Concert'),
(3, 'Sport'),
)
type = models.CharField(_('type'), max_length=16)
class Meta:
db_table = 'list_type'
class List(models.Model):
user = models.ForeignKey(User)
type = models.ForeignKey(ListType, help_text=_('Type of list'))
name = models.CharField(_('list'), max_length=128, help_text=_('Name of list'))
class Meta:
db_table = 'list'
unique_together = (('user', 'type', 'name'), )
class Item(models.Model):
# value contains the pk of a movie, concert, or sporting event record
lists = models.ManyToManyField(List, related_name='items').
value = models.IntegerField(_('item'), help_text=_('Item in list'))
class Meta:
db_table = 'item'
我一直在尝试用工厂男孩工厂代表Type表:
import factory
from list.models import ListType
class ListTypeFactory(factory.django.DjangoModelFactory):
type = 'Movie'
#type = ListType.objects.get(type='Movie')
class Meta:
model = Type
我遇到的问题是,当我运行单元测试并且只是设置时,我收到错误:
class ListTest(TestCase):
def setUp(self):
self.activity_type = ListTypeFactory(type='Member')
# => IntegrityError: duplicate key value violates unique constraint...
# => "Key (type)=(Movie) already exists"
...
这是有道理的,因为Django TestCase测试工具会复制我的所有表,并且list_type表已预先填充。但是在单元测试中表示此表的正确方法是什么? Factory-boy似乎不是正确的机制,我不想触摸数据库来创建表的实例,因为触摸数据库是一个单元测试反模式。