3

ですから、私はWebを少し見て回っていますが、探しているものがまったく見つかりません。最初に私が持っていると言う

class Contact(models.Model):
    nickname = models.CharField(max_length=25)
    number = models.CharField(max_length=25)
    note = models.TextField()

class Telephone(models.Model):
    contact = models.ForeignKey('Contact')

では、ニックネーム/番号/ notを保存して、すべてに付けることができるラベルに基づいてこれらすべてを見つけるにはどうすればよいでしょうか。

Telephone.objects.filter(contact = jill)を使用すると、ジルのインスタンスに基づくすべての情報が提供されるようにしたいとしますか?ジルを編集して、異なる保存を介して彼女に複数の番号を付けたい場合はどうなりますか?(しかし、ジルは私がそこに付けたラベルのニックネームではありません。)悪い例のようなものですが、電話でフィルタリング可能な名前付きインスタンスを介して連絡先のすべての情報を検索したいだけです。またはForeignkeyは私が探しているものではありませんか?

4

1 に答える 1

3
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()

これが少し明確になることを願っています。

于 2012-04-21T06:41:29.577 に答える