2

モデル インスタンスの作成および保存 (DB への挿入) 中に、Django のドキュメントと矛盾する非常に奇妙な動作が発生しています。考えられる理由で、私はすでにアイデアを使い果たしました 。これらの場合に、Django がすべてのフィールドを保存できない理由についての提案に非常に感謝しています。

私が使用しているこのクラス:

class Person(models.Model):
    user = models.ForeignKey(User)
    phone_number = models.CharField(max_length=20, blank=True)
    address     = models.CharField(max_length=200, blank=True)

そして、いくつかのケースで動作しないコードがあります:

# First Case
new_person = Person()
new_person.user = request.user
new_person.phone_number = '111111'
new_person.save(force_insert=True)

# Second One
new_person = Person(user=request.user, phone_number='111111')
new_person.save(force_insert=True)

# Third One 
new_person = Person.objects.create(user=request.user, phone_number='111111')

いずれにせよ、公式のDjangoドキュメントに基づいて、djangoはオブジェクトを作成してDBに挿入する必要があります。

実際、オブジェクトは正常に作成されます (および関連するすべてのフィールドが設定されます) が、DB に挿入された行にはフィールドのみが正しく入力され、設定さidれたフィールドは空白のままです。user_idphone_number

ただし、既存の (以前に保存された) オブジェクトのすべてのフィールドにアクセスして更新することは問題ありません。

blank=Trueクラス宣言から削除してPersonも(適切なテーブル変更を行って)、何も変わりません。

編集: 問題はより洗練されていることが判明しました。以下の私自身の回答の完全な説明と解決策

4

1 に答える 1

1

わかりました、私は説明を見つけました....

これは継承と関係があります。つまり、Person のサブクラスのインスタンスを作成したかったコードのさらに先です。したがって、別のクラスがありました:

class Person(models.Model):
    user = models.ForeignKey(User)
    phone_number = models.CharField(max_length=20, blank=True)
    address     = models.CharField(max_length=200, blank=True)

class ConnectedPerson(Person):
    connection = models.ForeignKey(AnotherClass)
    # etc..

Person のインスタンスを作成した後、それを ConnectedPerson に拡張するつもりで、次のようなコードを作成しました。

#creating instance of Person:
person = Person(user=request.user, phone_number='111111')
person.save(force_insert=True)

c_person = ConnectedPerson(id=person.id, connection=instance_of_another_c)

実際、使用ConnectedPerson(id=person.id)は、以前に作成された Person インスタンスを DB で上書きすることによって強制終了していました。


したがって、継承インスタンスの管理にあまり経験のない人向け:以前に作成したスーパー クラス インスタンスをサブクラス インスタンスの一部として使用する必要がある場合は、次のようにします。

#creating person but not saving it
person = Person(user=request.user, phone_number='111111')

######
#later
###### 

#creating subclass instance and saving
c_person = ConnectedPerson(user=request.user, connection=instance_of_another_c)
c_person.save()

#saving super class instance as part of subclass instance
person.pk = super(ConnectedPerson, c_person).pk
person.save()
于 2013-08-17T10:12:21.747 に答える