0

ForeignKeyフィールドにデフォルトが必要なことがあります。例:デフォルトの機能をシリアル化することができないので、機能のデフォルトは大きな問題を引き起こし、そこで時間がデシベルの移行に来るまで機能的なdjangoモデルフィールドのデフォルトを処理する最善の方法は何ですか?

class ReleaseManager(BaseManager): 

    def default(self): 
     return self.filter(default=True).order_by('-modified').first() 


class Release(BaseModel): 
    default = models.BooleanField(default=False) 
    ... 


class Server(models.Model): 
    ... 
    release = models.ForeignKey(Release, null=True, default=Release.objects.default) 

すべてがうまくと上記のコードで良いです。手動での移行はこれを回避することができますが、マイグレーションがおそらくsquashedである大規模なプロジェクトでは、これは定期的にこれが不注意な時間の爆弾を残します。

一般的な回避策は、フィールドのデフォルトをモデルの保存メソッドに移動することですが、モデルがrest frameworkなどで使用されている場合や、フィールドでデフォルトが予想されるフォームを作成する場合に混乱が生じます。

答えて

0

私の現在のお気に入りの回避策は、移行と残りのフレームワークや他のフォーム生成で動作します。これは、オブジェクトマネージャは、デフォルトの方法を提供し、それを取得するために、専門のForeignKeyフィールドを使用しています前提としています

class ForeignKeyWithObjectManagerDefault(models.ForeignKey): 

    def __init__(self, to, **kwargs): 
     super().__init__(to, **kwargs) 
     self.to = to 

    def get_default(self): 
     return self.to.objects.default().pk 


class Project(SOSAdminObject): 
    primary = ForeignKeyWithObjectManagerDefault(Primary, related_name='projects') 
    ... 

今期待通りの移行が仕事と私たちは、外部キーフィールドにデフォルトのオブジェクトを供給するために、我々は好きな機能を使用することができます。

関連する問題