2009-07-28 13 views
5

私は多対1の関係を作りようとしており、管理パネルからそれを制御できるようにしたいと考えています。これは私のmodel.pyです:Djangoで多対1の関係を管理する方法

from django.db import models 

class Office(models.Model): 
    name = models.CharField(max_length=30) 


class Province(models.Model): 
    numberPlate = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=20) 
    office = models.ForeignKey(Office) 

私のモデルがいくつかのオフィスを持つことを許可する私のモデルが欲しいです。私のadmin.py内側だから、

class ProvinceCreator(admin.ModelAdmin): 
     list_filter = ['numberPlate'] 
     list_display = ['name', 'numberPlate','office'] 

class OfficeCreator(admin.ModelAdmin): 
     list_display = ['name'] 

これは私には正しいようだ、私は管理パネルで、新しい地域を追加しようとするが、私はこれを取得:

TemplateSyntaxError at /admin/haritaapp/province/ 

Caught an exception while rendering: no such column: haritaapp_province.office_id 

感謝

答えて

6

それはあなたのモデルセットアップ後方を持っていることを縫い目。州に多くの事務所が必要な場合は、州はOfficeモデルの外部キーでなければなりません。

from django.db import models 

class Province(models.Model): 
    numberPlate = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=20) 

class Office(models.Model): 
    name = models.CharField(max_length=30) 
    province = models.ForeignKey(Province) 

これは、あなたが取得されていないエラーについては、一対多relationsship

を実装するための、簡単かつ非常に直感的な方法のようになります。あなたは新しいを追加するとき、「そのような列haritaapp_province.office_idを」 (あなたのケースのオフィスの)属性をモデルに追加するには、テーブルに列を手動で追加するか、またはテーブルと再実行syncdbの実行をドロップ:あなたはモデルに新しいフィールドを追加するとき

python manage.py syncdb 

Djangoは自動的にテーブルに新しい列を追加しません。

+0

最終的には、 "python manage.py syncdb"でさえ十分ではないので、sqlite3 dbを削除してそれを再生しなければなりませんでした:) 1つの小さな質問tho、外国のアイテムはProvince_objectとして選択/追加中に表示されます。代わりに名前を表示するように修正する方法は? よろしく –

+0

ああ自己編集: \tデフ__unicode __(自己): \t戻りself.name は私のために仕事をした:P refの中 –

+0

は「Djangoは自動的に新しい列を追加しません」に - ジャンゴ - 南は良い仕事をしていません私はマイグレーション命名体系がよりマルチデベロッパーであることを願っています。 – David

1

Inlinesのドキュメントを見ましたか?

あなたadmin.pyで

class Office(admin.TabularInline): 
    model = Office 

class ProvinceAdmin(admin.ModelAdmin): 
    inlines = [ 
     Office, 
    ]