1

クライアント向け機能に PHP を使用するサイトの管理パネルとして、Django (具体的には django-admin) を使用しています。私は、管理者を思い通りに見えるようにいじり回してきましたが、これまでのところとても良いです。ただし、解決する必要があるいくつかの問題に遭遇しました。

私が扱っているモデルは次のとおりです。

class Permissions(models.Model):
    id = models.IntegerField(primary_key=True)
    league_key = models.CharField(max_length=15) 
    commissioner_id = models.ForeignKey(Accounts, db_column='commissioner_id',
                                        to_field='id')
    status = models.IntegerField()
    key = models.CharField(max_length=50)
    publisher_key = models.CharField(max_length=25)
    publisher_display_name = models.CharField(max_length=50)
    base_league = models.ForeignKey('self', db_column='id')
    share = models.IntegerField()
    default_fixture_key = models.CharField(max_length=50)

    def __unicode__(self):
        return self.publisher_key + ' / ' + self.league_key

    class Meta:
        db_table = u'permissions'
        verbose_name = 'Permissions'
        verbose_name_plural = 'Permissions'

class PermissionsAdmin(admin.ModelAdmin):
    list_display = ('league_key', 'publisher_key', 'commissioner_id', 'status',
                    'base_league', 'share', 'default_fixture_key')
    list_display_links = ('league_key','commissioner_id', 'base_league')
    exclude = ('id',)

最初の問題は、既存のレコードを編集するための管理フォームがフィールドの 1 つを必須としてマークしていることです。フィールドが必須か必須でないかをdjango-adminに伝えるにはどうすればよいですか?

私が直面している2番目の問題は、このレコードを保存するように指示すると、次のエラーが発生することです: 重複したキー値が一意の制約「permissions_pkey」に違反しています。それは、Djangoが更新を行っていない、INSERTを行おうとしていると私に思わせます

また、これは Postgresql に関連する問題かもしれないと思いました。permissions_pkey はそのテーブルの制約であり、そのテーブルの ID を自動インクリメントするために使用されるシーケンスを追跡します

Django のドキュメントは素晴らしいものですが、これを理解するために必要な情報がないようです。

(編集: スタック トレースを掘り下げると、この素晴らしい小さなナゲットが見つかりました:

sql 
'UPDATE "permissions" SET "league_key" = E\'l.1258472565 \', "commissioner_id" = 7,
 "status" = 0, "key" = E\'cfcd208495d565ef66e7dff9f98764da \', 
"publisher_key" =     E\'chrishartjes.com \', 
"publisher_display_name" = E\'Chris Hartjes Free Press \', 
"id" = 744, "share" = 0, 
"default_fixture_key" = E\'\' WHERE "permissions"."id" = 745 '

これにより、私の小さな ForeignKey エントリ自体が問題を引き起こしていると思います)

4

3 に答える 3

2

問題 1: 設定に関するドキュメントを参照してnullくださいblank。簡単な話: 設定nullにより、DB は null 値を格納できます。ここで必要なのは (ほとんどの場合) blank、モデルを検証するときにそのフィールドが不要になるように True に設定することです。フィールドが CharField でない場合は、nullTrue にも設定する必要があります。ここのドキュメントを参照してください: http://docs.djangoproject.com/en/dev/ref/models/fields/#field-options

問題 2: あなたがここで求めているのはAutoFieldではなくだと思いますIntegerField。違いは、新しいオブジェクトを保存するときに AutoField が自動的に新しい ID を作成することだけです。ここのドキュメントを参照してください: http://docs.djangoproject.com/en/dev/ref/models/fields/#autofield

編集:(私のコメントから)もう一度見ると、エラーが参照していることがわかりますpermissions_pkeyidフィールドをに置き換えてみてくださいpkey = AutoField(primary_key=True)

于 2009-11-18T20:36:28.633 に答える
1
  1. null=Trueフィールドが必要ない場合は、フィールドにフィールド コンストラクターを入れます。編集:コメンターは言いますblank=True-彼はおそらく正しいです-私は私の前にドキュメントを持っていません。
  2. ID が空の場合は挿入を行い、ID に値がある場合は更新を行います。あなたが話している保存がどこで行われているのかわかりませんが、その情報が役立つかもしれません. (exclude( 'id')がおそらくこの問題を引き起こしていることを指摘する削除された回答があります-それも正しいと思います)

また、ドキュメントについても同意します。Python が読める場合は、知りたい分野の Django ソース コードを読むことを強くお勧めします。このソースは、私が今まで読んだ中で最も素晴らしく、最も読みやすいソースです。飛び込んで読むだけで問題が発生したことは一度もありません。ドキュメントとほぼ同じくらい優れています。

于 2009-11-18T20:28:55.867 に答える
0
  1. null=真、空白=真

  2. Permissions モデルに「id」列を明示的に含める必要はありません。それが 2 番目の問題の原因だと思います。

于 2009-11-18T21:41:27.037 に答える