1. ホーム
  2. Django

Django の ForeignKey パラメータの使用法

2022-03-02 21:08:28

<スパン リミットチョイス :

from django.db import models
from django.contrib.auth.models import User
from django.db.models import Q


class Book(models.Model):
name = models.CharField(max_length=20)
user = models.ForeignKey(User, limit_choices_to={'is_staff': True})
#user = models.ForeignKey(User, limit_choices_to=Q(is_staff=True))
    def __unicode__(self):
        return self.name

>>>Book.objects.filter(user=u)です。

>>>User.objects.filter(Book__name__startswith='hhh')です。


limit_choices_toは辞書形式でも、上の例のようにQで表現することもできます。

しかし、Qフォームを使用する場合、limit_choices_toに使用するフィールドはraw_id_fieldsに現れないと、失敗します。そして、辞書形式は通常通り動作します。

class BookAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'user'].
raw_id_fields = ('user',)
admin.site.register(Book, BookAdmin)

その場合、limit_choices_toの効果は無効となります。

関連名 :

<スパン

テーブル内の複数のフィールドが同じテーブルを指している場合、エラーが発生します。システムは、別のテーブルからXXX_set属性にアクセスして、どの属性がアクセスされているかを知る術がない。この場合、各フィールドに related_name 属性を定義し、別のテーブルからアクセスされたときに、 related_name の値に基づいて個々の属性を取得するようにする必要があります。

  1. クラス  dutyTeam(models.Model):  
  2. '' <スパン '''
  3.     related_name属性はここで定義する必要があります。
  4.     ''' <スパン
  5.     first=models.ForeignKey(watch,verbose_name=) 'ファーストウォッチャー' ,related_name=。 'ファースト' )  
  6.     second=models.ForeignKey(watch,related_name=) 'セカンド' ,verbose_name=。 <スパン '待機勤務者' )  
  7.     urgent=models.ForeignKey(watch,related_name=) '緊急' ,verbose_name=。 <スパン '緊急連絡先' )  

related_name が定義されている場合、クエリ "_set" は related_name に置き換えられるため、 "_set" を使用するとエラーが報告されます。

related_name='+' または '+': 'user+' で終わる場合、逆引きクエリはできません。

<テーブル <カラー パラメータ 説明 <スパン edit_inline 値がfalseでない場合、関連するオブジェクトはインラインで編集可能である。これはまた、そのオブジェクトがそれ自身の管理インターフェイスを持たないことを意味する。この値には  モデル.TABULAR または  モデル.STACKED は、インライン編集可能なオブジェクトがテーブルとして表示されるか、フィールドセットスタックとして表示されるかをそれぞれ示しています。 リミットチョイス

パラメータと値の辞書(`Database API Reference`_を参照)は、このオブジェクトに対してadminが利用できるオプションを制限するために使用されます。を使用します。 <スパン モデル.LazyDate の値で、このオブジェクトの選択を日付などで制限することができます。

limit_choices_to = {'pub_date__lte' : models.LazyDate()}


関連するpub_dateが現在の日付より前のオブジェクトの選択のみを許可する。

このパラメータは  <スパン edit_inline 互換性のないもの.

max_num_in_admin

インライン編集オブジェクトの場合、amdinに表示可能な関連オブジェクトの最大数です。つまり、最大10個のトッピングがあるピザと言うことであれば  <スパン max_num_in_admin=10 は、いずれも10種以上でないことを保証します。

これは、ピサの斜塔が10階建てしかないとは言いませんが...。ピサの斜塔は10階建て以上であることもあります。このパラメータは管理画面のみを制御します。

<スパン 最小管理者数 管理画面に表示される関連オブジェクトの最小値です。通常、作成時に表示される  <スパン num_in_admin 編集段階では、あらかじめ存在する関連オブジェクトに加えて  num_extra_on_change nullのオブジェクトです。ただし、どのような場合でも、少なくとも  最小管理者数 関連するオブジェクトが表示されます。 <スパン num_extra_on_change 編集段階で表示する、追加の空白の関連オブジェクトフィールドの数。 <スパン num_in_admin オブジェクト追加時に表示されるそのインラインオブジェクトのデフォルト数 raw_id_admin

これから取得する整数値(id値)に対して、ドロップダウンメニューの代わりにテキストボックスを表示する。関連するオブジェクトが何行も何行もある場合。を使うより、これを使った方がはるかに効率的です。  <select> もっと便利に

とは併用できません。  <スパン edit_inline 併用してください。

<スパン 関連名

リレーションシップの名前です。例えば、以下の場合  <スパン トッピング オブジェクトはフィールドを所有しています。

models.ForeignKey(Pizza)


<スパン <スパン 関連名 は、"topping_set" (以下から引用)になります。  クラス クラスの名前)を指定します。  <スパン ピザ このオブジェクトは、自動的に  <スパン トッピングセット オブジェクトセット記述子。

しかし  <スパン トッピング クラスは以下のように定義されています。

models.ForeignKey(Pizza, related_name="munchie")


では  <スパン トッピング オブジェクトセット記述子は次のようになります。  <スパン スナック菓子 .

このパラメータは、あるオブジェクトが他のオブジェクトと複数回関連付けられる場合にのみ、本当に役に立ちます。例えば ストーリー オブジェクトは両方とも  <スパン <スパン プライマリーカテゴリー このフィールドには、再び  <スパン セカンダリーカテゴリー フィールドを使用します。を確保するために カテゴリ オブジェクトが正しいオブジェクトセット記述子を持っている場合、これらのフィールドをこのように使用したい。

models.ForeignKey(Category, related_name="primary_storys")
models.ForeignKey(Category, related_name="secondary_storys")


... このように  <スパン カテゴリー オブジェクトが自動的に  <スパン プライマリーストーリー そして  <スパン セカンダリーストーリー オブジェクトセット記述子。

<スパン to_field 関連づけようとしているオブジェクトを関連づけるために使用されるフィールド。デフォルトでは、 Django は関連付けようとしているオブジェクトの主キーを使います。