4

django でモデルを編集した結果、以下のモデルで「テーブル reserve_time には予約という名前の列がありません」というエラーが表示されました。

from django.db import models
import datetime

class Club(models.Model):
    establishment = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    def __unicode__(self):
        return self.establishment

class Day(models.Model):
    club = models.ForeignKey(Club)
    day = models.DateField('day')
    def __unicode__(self):
        return unicode(self.day)

class Court(models.Model):
    club = models.ForeignKey(Club)
    day = models.ForeignKey(Day)
    court = models.IntegerField(max_length=200)
    def __unicode__(self):
        return unicode(self.court)

class Time(models.Model):
    club = models.ForeignKey(Club)
    day = models.ForeignKey(Day)
    court = models.ForeignKey(Court)
    time = models.TimeField('time')
    reservation = models.CharField(max_length=200)
    def __unicode__(self):
        return unicode(self.time)

後で python manage.py syncdb と python manage.py runserver を実行しましたが、それでも上記のエラーが発生します。これを修正する方法についてのアイデアはありますか? 「予約」フィールドを削除すると、正常に機能します。管理画面に「予約」のテキストボックスが表示されるのですが、保存しようとするとエラーが出ます。

4

2 に答える 2

10

ここでの問題は、フィールドを変更したときにdjangoがテーブルを修正するために何もしないことです。まだsyncdb存在していないテーブルを作成するだけです。スキーマを変更してフィールドを追加する場合は、データベースに手動で作成するか、テーブルを削除して再作成するか、 Southsyncdbなどのプロジェクトを使用してデータベースの移行を処理する必要があります。

これが機能しない理由は、理論的にはテーブルに既存のレコードがすでに存在し、これらの欠落しているすべてのフィールドをどのように処理するかを確実に知る方法がないためです。たぶん、これらのフィールドをnullにすることはできません。多分彼らは満たさなければならない他の制約を持っています。どうやら南はこの状況を管理することができます。

更新(2019年12月)

djangoを使用してから7年以上が経過しましたが、現在、データベース移行機能がファーストクラスのコンセプトとして統合されているようです: https ://docs.djangoproject.com/en/3.0/topics/migrations/

于 2012-05-21T06:12:21.733 に答える
0

Syncdb は既存のモデルを dbwise に変更しません。データベースを手動で編集するか、データベースからモデルを削除して syncdb を再度実行することが 1 つの可能性です (適切なバックアップがない生産環境では実行しないでください)。

于 2012-05-21T06:13:41.477 に答える