Telephone.objects.filter(contact__nickname='jill')
クエリの作成に関するドキュメントを参照してください
what if i wanted to be able to edit jill and give her more than one number via
different saves is this possible?
はい、そうです。連絡先オブジェクトに複数の電話番号を指定するには、2つの方法があります。1対1の関係ForeignKey
、または多対多の関係です。ドキュメントのモデルトピックを一読することをお勧めします。
編集
使用しているモデルレイアウトの保存ごとに、ジルに複数の電話番号を指定できます。
ジルに新しい回線があるので、新しい電話番号を追加するとします。現在の構造では、最初に連絡先で「ジル」を見つけてから、新しい電話番号を彼女に与える必要があります。
jill = Contact.objects.get(nickname='jill') # assuming you only have one jill
new_num = Telephone.objects.create(contact=jill,number=5551212)
ジルのすべての連絡先が必要な場合は、次のようにします。
call_jill = Telephone.objects.filter(contact=jill) # if you already pulled jill
call_jill = Telephone.objects.filter(contact__nickname='jill')
それを行う別の方法は、ManyToMany
:を使用することです。
class Telephone(models.Model):
number = models.PhoneNumberField()
class Contact(models.Model):
# your normal fields
phones = models.ManyToMany(Telephone)
今、あなたはすることができます:
jills_phones = Contact.objects.get(nickname='jill').phones.all()
新しい電話を追加するには:
jill = Contact.objects.get(nickname='jill')
jill.phones.add(Telephone.objects.create(number=5551212))
jill.save()
逆のこともできます。これが誰の電話かを調べてください。
phone = Telephone.objects.get(number=5551212)
whose_is_it = phone.contact_set.all()
では、違いは何ですか?
どちらも似ているように聞こえますが、違いは微妙です。単純な例えは簡単です。1つのメーカーは多くの車を持つことができますが、1つの車は1つのメーカーしか持つことができません-これは車とメーカーの間で1対1です。
ピザには多くのトッピングを含めることができ、各トッピングは複数のピザに付けることができます。この場合、ピザはManyToMany
トッピングと関係があります。
あなたは私がそれをすることができると思っているかもしれませんForeignKey
。あなたは正しいですが、このシナリオを検討してください。
最初に始めて、トッピングがないとします。したがって、トッピングとしてオリーブを作成し、それをピザに追加します。素晴らしい。
今度は、同じピザにピーマンも入れたいと思います。1つのピザは1つのトッピングしか持てないため(のためForeignKey
)、今あなたは立ち往生しています。
したがって、ピザとトッピングへの参照を保持する3番目のモデルを作成することになります。したがって、ピザにトッピングを置く代わりに、この他のモデルにトッピングを置きます。
class Pizza(models.Model):
topping = models.ForeignKey('Topping')
class Topping(models.Model):
name = models.CharField(max_length=100)
class AssembledPizza(models.Model):
topping = models.ForeignKey('Topping')
pizza = models.ForeignKey('Pizza')
ただし、ManyToManyを使用して正しい方法で実行した場合は、次のようになります。
class Pizza(models.Model):
toppings = models.ManyToMany('Topping')
class Topping(models.Model):
name = models.CharField(max_length=100)
次に、次のようにします。
ここでは、あなたが新しいレストランであり、トッピングがないと仮定しています。詳細については、ドキュメントを参照してcreate
ください。
veggie = Pizza()
veggie.toppings.add(Topping.objects.create(name='Olives'))
veggie.toppings.add(Topping.objects.create(name='Peppers'))
veggie.save()
これが少し明確になることを願っています。