2016-09-29 8 views
0

私はdjangoプログラマーにとって非常に簡単なはずの質問がありますが、現時点では解決方法を理解できません。Django admin:管理者ビューの外部キーのlist_display/search_fields外部キー

私はこれらの三つのモデル(私は私ができる限り簡素化する)持っている:あなたが見ることができるように

class Nations(models.Model): 
    label = models.CharField(max_length=200) 
    iso2 = models.CharField(max_length=2, unique=True) 

class Cities(models.Model): 
    label = models.CharField(max_length=200, null=True) 
    country_code = models.ForeignKey(Nations, to_field='iso2', on_delete=models.SET_NULL, null=True, verbose_name='Nation') 

class Person(models.Model): 
    username = models.CharField(max_length=200, blank=False) 
    city = models.ForeignKey(Cities, on_delete=models.SET_NULL, null=True, blank=True) 

は、人のモデルがちょうど都市モデルに接続されています。私がする必要があるのは、Nations.labelの値を示す列を管理ビューに追加して検索可能にするために、PersonAdminクラスを設定することです。下の例では、このフィールドcity_country_code__labelを呼び出して、私が意味することを理解できるようにします(ただし、Personモデルにcountry_codeオブジェクトがないため、動作しません)。

class PersonAdmin(admin.ModelAdmin): 

    list_display = ('id', 'username', 'city', 'city__country_code__label') 
    ordering = ('username',) 
    raw_id_fields = ('city',) 
    search_fields = ['username', 'city__label', 'city__country_code__label'] 

[...] 

これを行うにはどうすればよいですか?

前もって太もも!

答えて

2

人物をobjにして国名ラベルを返すメソッドをモデル管理者に追加します。次に、メソッドをlist_displayに追加します。

class PersonAdmin(admin.ModelAdmin): 
    def country_label(self, obj): 
     return obj.city.country_code.label) 

    list_display = ('id', 'username', 'city', 'country_label') 
    list_select_related = ['city__country_code'] 
    ordering = ('username',) 
    raw_id_fields = ('city',) 
    search_fields = ['username', 'city__label', 'city__country_code__label'] 

詳細については、list_displayを参照してください。

注意私はlist_select_relatedを使用してSQLクエリの数を減らしました。

+0

素晴らしい作品です。ありがとうAlasdair! –