0

あるモデル (UserProfile モデル) のモデルから作成した別のアプリへの外部キーを持つ別のアプリがあります。私がしようとするsyncdbと、そのアプリにフィクスチャがあるにもかかわらず、外部キー ID が NULL であることがわかります。YAML ファイルがロードされる順序を指定する方法はありますか?

アプリの構造は次のようになります -

プロフィール/

# models.py
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    school = models.ForeignKey(School)


def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

# fixtures/initial_data.yaml
-   fields:
        username: admin
        password: ***password hash here***
        date_joined: 2012-02-01 01:00:00
        email: email@email.com
        last_name: Last
        first_name: First
        groups: []
        is_active: true
        is_staff: true
        is_superuser: true
        last_login: 2012-02-01 01:01:00
        user_permissions: []
    model: auth.user
    pk: 1
-   fields:
        user: 1
        school: 1
    model: profile.UserProfile
    pk: 1

学校/

# models.py
class School(models.Model):
    name = models.CharField(max_length=100)

# fixtures/initial_data.yaml
-   fields:
        name: "School"
    model: school.School
    pk: 1

そしてsyncdb私は得る:

IntegrityError: profile_userprofile.school_id may not be NULL

これは、学校の前に UserProfile モデルを保存していることを意味するに違いありません。だから、学校がNULLになることを許可せずに、yamlファイルを並べ替えたり、何らかの方法で学校をUserProfileに属性付けたりすることがまったく可能かどうか疑問に思っています。

settings.py では、インストールされているアプリを読み込んschoolprofileいます。

4

1 に答える 1

2

ここでの正しいアプローチは、自然キーを使用することです。

使用できない場合は、フィクスチャを手動でロードできます。名前を変更して、manage.py loaddata必要な順序でロードするだけです。

于 2012-02-28T12:47:03.753 に答える