我在测试中使用Django的灯具。我需要创建UserProfile夹具。第一个问题是它指向用户输入。为了处理它,我使用自然键。所以我只是说UserProfile fixture的用户字段是User fixture的实际用户名。
[
{
"pk": 8002,
"model": "auth.user",
"fields": {
"date_joined": "2012-08-28 10:00:00.000000+00:00",
"email": "",
"first_name": "",
"groups": [],
"is_active": true,
"is_staff": false,
"is_superuser": false,
"last_login": "2012-08-28 10:00:00.000000+00:00",
"last_name": "",
"password": "pbkdf2_sha256$10000$ltmEKsdCPjuK$74ZwNUh8rqFAPZ6+Cmi3tc8A94ueeXTplFqOQKlY4hc=",
"user_permissions": [],
"username": "user8002"
}
},
{
"pk": null,
"model": "spam_and_eggs.userprofile",
"fields": {
"user": ["user8002"],
"language": "",
"email_activated": true
}
}
]
不幸的是,它给出了一个错误:
IntegrityError: Could not load share4you.UserProfile(pk=None): column user_id is not unique
这是第二个问题。我认为它可能会失败,因为当使用Django的信号创建用户时会自动创建UserProfile,并且由于已经创建了该用户的UserProfile,因此夹具失败。这可能是原因吗?有没有办法解决它?
感谢任何建议!
编辑#1:
模型和信号:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
language = models.CharField(max_length=255, null=True, blank=True)
email_activated = models.BooleanField()
@receiver(post_save, sender=User)
def create_profile(instance, created, **kwargs):
if created:
UserProfile.objects.get_or_create(user=instance)
用户模型为django.contrib.auth.models.User
。
答案 0 :(得分:4)
是否可以使用Django的灯具改变现有数据?
当然,如果一个灯具有一个存在于数据库中的pk,django会进行更新。
user = models.ForeignKey(User,unique = True)
这很有意思,为什么不是OneToOneField呢?
>>> a=User.objects.all()[0]
>>> a.userprofile_set.all()
[<UserProfile: UserProfile object>]
>> a.userprofile_set.create(language='bar')
IntegrityError: column user_id is not unique
IntegrityError:无法加载share4you.UserProfile(pk =无):列user_id不唯一
pk=null
,设置一个实数"user": ["user8002"]
。"user": 8002
我认为它可能会失败,因为当使用Django的信号创建用户时会自动创建UserProfile,并且由于已经创建了该用户的UserProfile,因此夹具失败。
我无法重现此行为。这些灯具可以与您的模型一起加载和重新加载:
[
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "jpic",
"first_name": "",
"last_name": "",
"is_active": true,
"is_superuser": true,
"is_staff": true,
"last_login": "2012-06-11T06:44:57.637Z",
"groups": [],
"user_permissions": [],
"password": "pbkdf2_sha256$10000$KzsUTACvZgJU$qvywXdVv/N3s5lifS/gQxSGog36ExGbuj2U+IQ6aUNk=",
"email": "t@tt.tt",
"date_joined": "2012-06-11T06:44:57.637Z"
}
},
{
"pk": 1,
"model": "test_app.userprofile",
"fields": {
"language": "example.com",
"user": 1
}
}
]
此外,这是使用django-annoying创建UserProfile类的另一种可能性:
from annoying.fields import AutoOneToOneField
class UserProfile(models.Model):
user = AutoOneToOneField('auth.User', primary_key=True)
home_page = models.URLField(max_length=255, blank=True)
答案 1 :(得分:1)
您可以在创建配置文件中检查原始参数。它表示,如果它来自固定装置,请检查this以获取更多详细信息。这样您就可以控制配置文件的创建。
答案 2 :(得分:0)
我建议你也看看django-pyfixture。这将使您的数据看起来像夹具,但更加“聪明”。