0

https://docs.djangoproject.com/en/1.4/topics/db/models/で作業しているときに、djangoで新しいアプリを起動し、ウォークスルーで定義されているようmyappにファイルを編集しました。models.py

class Person(models.Model):
  GENDER_CHOICES = (
    (u'M', u'Male'),
    (u'F', u'Female')
  )
  name = models.CharField(max_length=60)
  gender = models.CharField(max_length=2, choices=GENDER_CHOICES)

次に、実行して、インタラクティブプロンプトmanage.py syncdbで次の数行を実行しようとしましたmanage.py shell

>>> p = Person(name="Fred Flintstone", gender="M")
>>> p.save()
Traceback (most recent call last):
  .…[I removed a few lines]...
  DatabaseError: table myapp_person has no column named name
>>> p.gender
u'M'
>>> p.get_gender_display()
u'Male'

...それで、sqlite3がデータベースにPersonという名前の列を持つオブジェクトを持っているかどうかを確認しました

C:\Users\djangoSite>python manage.py sql myapp
BEGIN;
CREATE TABLE "myapp_person" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(60) NOT NULL,
"gender" varchar(2) NOT NULL

);

そしてもちろんそうです!つまり、Personモデルは存在しますが、models.pyで設計したフィールドを取得しませんか?電話をかけたdir(Person)ところ、名前と性別のフィールドがそこにないことが確認されました…次に、電話をかけましたが、そこにありdir(p)ます。これは、そのタプルを追加したばかりであるためだと思います。これは驚きではありません。

大きな問題は次のとおりです。

  1. なぜ私は'p.save()'できないのですか?
  2. import呼び出しで、設計したフィールドを持つオブジェクトが取り込まれないのはなぜmodels.pyですか?
  3. これは仕様によるものですか?
  4. 私はそれを間違っているだけですか?
4

1 に答える 1

1

なぜできないのですp.save()か?

個人テーブルにnameという名前の列はありません。 manage.py sql myappモデルに基づいてdjangoが生成するSQLを表示するだけです。sqliteの実際のテーブルではありません。(もちろん一致する必要があります)sqliteデータベースを入力し、テーブルとそのスキーマを確認することが重要です。開発中にsyncdbを実行し、後でモデルに変更を加えることがわかりました。dbを再同期しても、テーブルは変更されません。テーブルを削除してから再同期するか、テーブルを変更する必要があります。

import呼び出しで、models.pyで設計したフィールドを持つオブジェクトが取り込まれないのはなぜですか?

この問題を反映するように質問を変更してください。人物オブジェクトへのアクセスまたはインスタンス化に問題があるようには見えません。

これは仕様によるものですか?

いいえ、これは仕様によるものではないと思います。これらは、新しいユーザーが新しいフレームワークを学習するときに発生する一般的な問題だと思います。私が学んでいた数週間から数ヶ月の間、私はこれらのようなあらゆる種類の問題に遭遇しました、それらはますます離れていきます。物事が正しく機能することを確認していることを確認してください。manage.pysqlmyappのチェックはそれほど重要ではありません。データベースをチェックしてスキームを表示する方が適切です。Djangoは成熟したプラットフォームであり、missing colum 99.9%の確率でエラーが発生する場合は、それが透過的であることを正確に意味します。

于 2012-04-27T00:03:24.653 に答える