将SearchVectorField添加到Django中的模型

时间:2017-04-06 15:44:12

标签: python django postgresql django-models django-postgresql

所以我试图在Django中为模型添加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:

如果表格为空,为什么会这样说?我不想让列可以为空,如果我可以避免它,我宁愿没有默认值。

我的问题是,有没有办法强制makemigrationsmigrate,因为如果表格为空,我不明白问题。我有其他表格,其中包含我不想删除的数据,因此无法删除数据库中的所有信息。

或者,如果选项1)是解决方案,我将如何格式化此类字段的默认值?我认为这不是一个普通的文本字段?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我不完全确定你为什么不想要一个默认值,但我会认为这是给定的。

  

我的问题是,有没有办法强制makemigrations和迁移   因为如果桌子是空的,我不明白这个问题。

您的当前数据库表可能为空,但迁移应该在其他数据库实例上可重复。因此,Django不能假设任何其他数据库也是如此。

解决方法可能是定义一个将字段创建为可空的迁移,为所有条目编制索引,然后将其更新为不可为空。

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="@dimen/spacing_medium">

        <LinearLayout
            android:id="@+id/lyt_fullname_upload"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/selectableItemBackground"
            android:clickable="true"
            android:gravity="center_vertical"
            android:minHeight="@dimen/spacing_xxlarge"
            android:onClick="clickLayout"
            android:orientation="horizontal">


            <ImageView
                android:layout_width="@dimen/spacing_mlarge"
                android:layout_height="@dimen/spacing_mlarge"
                android:layout_margin="@dimen/spacing_middle"
                android:src="@drawable/ic_name_mountain_212121"

                android:tint="@color/colorPrimaryBlack" />    


            <android.support.design.widget.TextInputLayout
                android:id="@+id/input_layout_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">


                <EditText
                    android:id="@+id/fullname_upload"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:maxLength="250"
                    android:layout_margin="@dimen/spacing_medium"
                    android:hint="@string/placeholder_chillspot_name"
                    android:textSize="18sp"
                    android:text="sagdkojsgdfjiklnsagdikljsgdafnmkljsagdfmlskagdmgsdaůlksmdgklůsgdamlůksagdsdfztpkmtzrskoůltzersklůodmsljkdmgslkjdgmslkgsedmlgfůdekmgerlaskůmsgadflůsgm,aasgklů,"/>
            </android.support.design.widget.TextInputLayout>

            <TextView
                android:id="@+id/textView_counter"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:gravity="top"
                android:text="5" />

        </LinearLayout>

答案 1 :(得分:0)

我只是让字段可以为空(并且可能不可编辑,因为您不会在管理界面中或通过表单更改它):

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

迁移不存在任何问题。

稍后你可以使这个字段不可为空,但没有真正的理由这样做,因为无论如何你都会以编程方式更新它。