2012-03-27 13 views
0

現在、私たちのデータベースには、日付フィールドが文字列として入力されています(例:11/7/2009)。私のmodels.pyファイルには、このフィールドをTextFieldからDateFieldに変換するために、管理コンソールでユーザーが手動で入力する代わりにカレンダービューから日付を選択できるようになっていますか?おそらく、その場でそれを解析しますか?Django管理コンソール - 文字列をDateFieldに構文解析

date = models.TextField()

変換するには...

date = models.DateField() 
+0

フィールドをDateFieldに変更し、それに応じてデータを移行することを検討しましたか? – Amber

答えて

0

あなたの最善の策は、正しくデータを格納する開始することです。これを行うには、テーブルを変更して日付タイプの新しいフィールド(データベース内)を追加する必要があります。 charfieldの既存の日付データをこの新しいフィールドに解析し、最後にテーブルを変更してcharfieldを削除し、一時日付フィールドの名前を適切に変更します。

このプロセスは、django-southを使用して移行を管理することで簡略化できます。テンポラリフィールドを追加するためのスキーママイグレーション、データの変換のためのデータマイグレーション、古いカラムを削除するスキーママイグレーション、新しいカラムの名前を変更する3つのマイグレーションが必要です。

あなたは管理者のカスタムフォームを試してみることができます。実行時に変換を強制することができるかもしれませんが、実際にデータを正しく格納する必要があるため、実際には素晴らしいアイデアはありません。私は管理者の前にカスタムフォームを使用しましたが、このためではありませんので、動作するかどうかは確信できません。

+0

"inspectdb"を使用して、すべてのモデルを作成しました。データベースのデフォルトの日付書式は何でしょうか?そうすれば(おそらく南を使用して)これを再度実行して列とDateFieldを受け入れることができるでしょうか? – Austin

+0

データベース内のデータを実際に調べる必要があります。あなたがinspectdbを使用して以来、私はこのデータがアプリケーションから来たものだと考えています。これは最初に暗示していたよりも複雑になる可能性があります。レガシーアプリケーションをまだ使用している場合は、チャーフィールドで表されるデータに依存していないことを確認する必要があります。私はデータがどのようなフォーマットであるかを推測することはできませんが、dbクライアントを起動してSELECT *をテーブルから実行するだけでは簡単には分かりません。 – John

0

MSSQLの列をdateと入力しても、同じ問題が発生していました。私はpyodbcを使って私たちのバックエンドのサーバを助けていることも述べておくべきです。変更は、operation.pyファイルのpyodbcコード内で行われました。タイプ - 例外が追加されました。我々は追加した後

def convert_values(self, value, field): 
    ....... 
    elif field and field.get_internal_type() == 'DateField': 
     try: 
      value = value.date() # extract date 
     #ADDED THE FOLLOWING TO CATCH THE ERROR 
     except AttributeError: 
      value = datetime.datetime.strptime(value, '%Y-%m-%d').date() 

このDjangoの管理コンソールは、カレンダーウィジェットを表示しました。