Django 模型:多个配方与单个配方具有外键关系
我已经有一段时间对模特妈妈很恼火了,但我不知道该怎么做 让我们假设一个简单的关系:Django 模型:多个配方与单个配方具有外键关系,django,testing,model-mommy,Django,Testing,Model Mommy,我已经有一段时间对模特妈妈很恼火了,但我不知道该怎么做 让我们假设一个简单的关系: class Organization(models.Model): label = models.CharField(unique=True) class Asset(models.Model): organization = models.ForeignKey(Organization) label = models.CharField(unique=True) 和食谱: from
class Organization(models.Model):
label = models.CharField(unique=True)
class Asset(models.Model):
organization = models.ForeignKey(Organization)
label = models.CharField(unique=True)
和食谱:
from model_mommy.recipe import Recipe, foreign_key
organization_recipe = Recipe(Organization, label='My Organization')
asset1_recipe = Recipe(Asset,
organization=foreign_key(organization_recipe),
label='asset 1')
asset2_recipe = Recipe(Asset,
organization=foreign_key(organization_recipe),
label='asset 2')
现在,当我制作这些资产配方时,我得到一个错误:
>> asset1 = asset1_recipe.make()
>> asset2 = asset2_recipe.make()
IntegrityError: duplicate key value violates unique constraint "organizations_organization_label_key"
DETAIL: Key (label)=(My Organization) already exists.
这可以通过将asset1的组织作为参数提供给asset2的make方法来解决:
>> asset1 = asset1_recipe.make()
>> asset2 = asset2_recipe.make(organization=asset1.organization)
但必须有一种更简单、更干净的方法来做到这一点
编辑
根据Helgi答案中的链接,我已将所有配方外键更改为指向结束:
def organization_get_or_create(**kwargs):
"""
Returns a closure with details of the organization to be fetched from db or
created. Must be a closure to ensure it's executed within a test case
Parameters
----------
kwargs
the details of the desired organization
Returns
-------
Closure
which returns the desired organization
"""
def get_org():
org, new = models.Organization.objects.get_or_create(**kwargs)
return org
return get_org
my_org = organization_get_or_create(label='My Organization')
asset1_recipe = Recipe(Asset,
organization=my_org,
label='asset 1')
asset2_recipe = Recipe(Asset,
organization=my_org,
label='asset 2')
可以创建任意数量的资产:
>> asset1 = asset1_recipe.make()
>> asset2 = asset2_recipe.make()
这似乎是不可能的(至少现在是这样),但是这个特性已经讨论过了。请看这里: