2017-12-14 3 views
-1

(ちょうどsqliteの切り替えと前にこの問題を持っていなかった)ジャンゴOneToOneField

だから私は3つのモデルがあります:

モデル。 PY

class Person(models.Model): 
    is_parent = models.BooleanField() 

class VideoGamePurchase(models.Model): 
    bought_by = models.ForeignKey(Person) 
    after_homework = models.OneToOneField(HomeWork, OPTIONS???) 

class HomeWork(models.Model): 
    done_by = models.ForeignKey(Person) 
    content = models.CharField(blablaba) 

だから私が実装しようとしてるのロジックはPerson.is_parentTrueVideoGamePurchaseインスタンスのことが可能であるならばということですafter_homeworkの空または空フィールドで作成する必要があります。ただし、Person.is_parentFalseの場合は、このフィールドを一意のHomeWorkオブジェクトの主キーにします。

私はこれを達成するために、右のオプションを見つけることができません。

私はprimary_key=Trueを持っていない場合は、makemigrationsが失敗した:

You are trying to add a non-nullable field 'id' to video_game_purchase without a default; we can't do that (the database needs something to populate existing rows). 
Please select a fix: 
1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 
2) Quit, and let me add a default in models.py 

ので、私は私が primary_key=Trueを持っている肝炎と思います。しかし、私は null=Trueまたは blank=Trueを持つことができないようです。

OneToOneFieldをpostgreSQLで空にする方法はありますか?

このようなロジックを実装する他の方法がありますか?

ありがとうございました!

答えて

1

after_homeworkフィールドをオプションにする場合は、null=Trueblank=Trueを使用する必要があります。

class VideoGamePurchase(models.Model): 
    bought_by = models.ForeignKey(Person) 
    after_homework = models.OneToOneField(HomeWork, null=True, blank=True) 

あなたはafter_homeworkためprimary_key=Trueを望んでいない - フィールドがオプションである場合には意味がありませんVideoGamePurchaseモデルのafter_homework主キーフィールドになるだろうという。

after_homeworkフィールドの前にprimary_key=Trueがあるため、移行がうまくいかないようです。最も簡単な修正は、新しいデータベースから始め、そのアプリケーションの移行を削除してから、makemigrationsmigrateに再実行することです。今回は、VideoGamePurchaseモデルの場合、移行によって自動的にプライマリキーフィールドidが作成されます。

+0

Nailed it! ありがとう! –