2017-04-06 8 views
1

でモデルにSearchVectorFieldを追加するだから私はジャンゴでモデルにSearchVectorFieldを追加しようとしています:はジャンゴ

class JobPosting(models.Model): 
    ... 
    ... 
    search_vector = SearchVectorField() 

私はそれがnullableであるかのことができるようにするために、デフォルト値を持たなければならないのいずれかのことを取得します移行するので、この問題を防ぐためにテーブルのすべてのエントリを削除しました。 makemigrationsを実行するときに

しかし、私は次のエラーを取得しています:表が空の場合

You are trying to add a non-`nullable` field 'search_vector' to jobposting 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 
Select an option: 

は、なぜそれがこれを言っていますか?カラムをnullにする必要はありません。それを避けることができれば、デフォルト値を持たないと思います。

私の質問は、テーブルが空であれば、私が問題を理解していないので、makemigrationsmigrateを強制する方法はありますか?私は削除したくない他のテーブルを持っていますので、データベース内のすべての情報を削除することはできません。

また、オプション1)が解決策である場合、このタイプのフィールドのデフォルト値をどのようにフォーマットしますか?通常のテキストフィールドではないと思いますか?

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

答えて

1

なぜデフォルト値を使用したくないのか完全にはわかりませんが、これを想定しています。

私の質問は、makemigrationsを強制すると、テーブルが空の場合、私は問題を理解していないよう を移行する方法があります。

あなたの現在データベーステーブルが空であるかもしれないが、移行は、他のデータベースインスタンス上で再現可能になっています。したがって、Djangoは同じデータベースが他のデータベースで保持されていると仮定することはできません。

フィールドをヌル可能にする移行を定義し、すべてのエントリを索引付けし、それをヌルにできないように更新することが考えられます。

class JobPosting(models.Model): 
    ... 
    ... 
    search_vector = SearchVectorField(null=True, editable=False) 

そして、いやがあるでしょう:私はちょうどフィールドのNULL可能を作る(そしておそらく編集できません、あなたが管理インタフェースでも、フォームを経由して、それを変更するつもりはないので)と思い

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.contrib.postgres.search import SearchVector, SearchVectorField  
from django.db import migrations 


def index_entries(apps, schema_editor): 
    Entry = apps.get_model("mymodel", "Entry") 
    Entry.objects.update(search_vector=SearchVector('body_text')) 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('mymodel', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='entry', 
      name='search_vector', 
      field=SearchVectorField(null=True), 
     ), 

     migrations.RunPython(index_entries), 

     migrations.AlterField(
      model_name='entry', 
      name='search_vector', 
      field=SearchVectorField(null=False), 
     ), 
    ] 
0

移行に関する問題。

後でこのフィールドをnullにできないようにすることができますが、これをプログラムで更新するため、実際に行う必要はありません。