4

テストではDjangoのフィクスチャを使用しています。UserProfileフィクスチャを作成する必要があります。最初の問題は、ユーザーエントリを指していることです。これに対処するために、私は自然キーを使用しています。つまり、UserProfileフィクスチャのユーザーフィールドはUserフィクスチャの実際のユーザー名です。

[
    {
        "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

ここに2番目の問題があります。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です。

4

3 に答える 3

5

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 = None)を読み込めませんでした:列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)
于 2012-08-28T09:44:51.213 に答える
1

プロファイルの作成で生のパラメータを確認できます。フィクスチャからのものかどうかを示します。詳細については、これを確認してください。このようにして、プロファイルの作成を制御できます。

于 2012-08-28T09:45:26.377 に答える
0

django-pyfixtureもご覧になることをお勧めします。これにより、データはフィクスチャのように見えますが、もう少し「スマート」になります。

于 2013-05-07T18:12:19.343 に答える