1

ブック モデルをデータベースに追加し、SQL データベース ブラウザーでブック テーブルを確認すると、id フィールドが空白として表示されます。

テーブルに1000個のアイテムがあるのは奇妙です。そのうち 390 人に ID が入力されているため、何が起こったのかわかりません。その他の ID は空白です。

id フィールドは本質的に主キーであるべきではありませんか? あるケースではどのようにデータが取り込まれ、他のケースでは取り込まれなかったのでしょうか。

注 1: 過去にレコードを手動で削除しましたが、それが問題になるかどうかはわかりません。注 2: Iprint "newbook id:", repr(newbook.id)の場合、ID は SQL データベース ブラウザーに表示される主キーとは異なります。

これは私が見るものです:

ここに画像の説明を入力

関連するコードは次のとおりです。

モデル:

class Books (models.Model):
    bookname=models.CharField(_('bookname'), max_length=255)
    publisher=models.CharField(_('publisher'), max_length=255)
    description=models.TextField(_('description'), blank=True)
    coverart = models.ImageField(upload_to="art", blank=True, null=True)
    source=models.TextField(blank=True) #source of where it came from
    last_updated=models.DateTimeField(_('added'), default=datetime.now)
    category_id=models.ManyToManyField(Category, related_name='cat')
    model = models.ManyToManyField ('model', related_name = 'model')
    shortdesc=models.TextField(_('description'), blank=True)
    url = models.TextField(_('url'), blank=True)
    uid = models.IntegerField()`

本を保存するコード:

try: 
    exists = Books.objects.get(bookname=bookname)
except Books.DoesNotExist:
    print "book does not exist -- adding now"
    newbook=Books(bookname=bookname, uid = uid, source='Mysourceofbooks',     publisher=publisher, description = description, shortdesc=shortdesc, url = url)
    newbook.save()
    for cat in category_ids:
        newbook.category_id.add(cat)
else:
    print "log: we found the book in the DB already"`
4

2 に答える 2

2

チャットでの議論によるidと、表の列はBookどういうわけか としてのステータスを失いましたPRIMARY KEY。それを元に戻せば、準備完了です。

于 2012-06-12T20:32:02.577 に答える
-1

まず、モデルのテスト/保存に関数get_or_createを使用できます。タプルを返します-作成されたオブジェクト。

オブジェクトを新しい ID で保存できる場合: object.pk を None に設定して保存します。あなたのコードでは、もっとクレイジーだと思います。=> Book は、Books というモデルに適した名前です。

これについてどう思いますか:

for cat in category_ids:
    print cat
    newbook.category_id.add(cat)

category_ids 変数とは何ですか? ManyToMany に「category_id」という名前を付ける理由

于 2012-06-12T19:57:20.787 に答える