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?
是的。要在联系对象中为一件事提供多个电话号码,有两种方法 - 通过 a 的一对一关系ForeignKey
,或多对多关系。我建议您通读文档中的模型主题。
编辑
在您拥有的模型布局中,您可以在每次保存时为 Jill 提供多个电话号码。
假设 Jill 有一条新线路,因此您想添加一个新电话号码。按照您现在的结构方式,您首先必须在“通讯录”中找到“Jill”,然后给她一个新的电话号码:
jill = Contact.objects.get(nickname='jill') # assuming you only have one jill
new_num = Telephone.objects.create(contact=jill,number=5551212)
现在,如果您想要 Jill 的所有联系人,您可以:
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()
那么有什么区别呢?
它们听起来很相似,但差异很微妙。一个简单的类比很容易。一个制造商可以拥有多辆汽车,但一辆汽车只能拥有一个制造商——这是汽车和制造商之间的一对一关系。
一个披萨可以有很多配料,每个配料可以放在多个披萨上。在这种情况下,PizzaManyToMany
与 Toppings 有关系。
您可能会认为我可以使用ForeignKey
. 你是对的,但考虑一下这种情况:
假设您开始时没有浇头。因此,您将橄榄制作为浇头,然后将其添加到比萨饼中。伟大的。
现在你想要同样的披萨也有青椒。现在你被卡住了,因为一个披萨只能有一个浇头(由于ForeignKey
)。
因此,您最终创建了第三个模型,其中包含对比萨饼和浇头的引用。因此,不是在比萨上放浇头,而是将它们放在另一个模型上:
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()
我希望这能澄清一点。