3

所以我一直在网上浏览了一下,但我找不到我要找的东西。首先说我有

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')

那么我将如何保存昵称/号码/不,然后能够根据我可以给它们的一些标签找到所有这些?

假设我希望当我使用 Telephone.objects.filter(contact=jill) 时,将提供基于 jill 实例的所有信息?如果我希望能够编辑吉尔并通过不同的保存给她多个号码,这可能吗?(但吉尔不是她的昵称,它是我放在那里的标签。)有点不好的例子,但说我只想通过一些可通过电话过滤的命名实例找到联系人中的所有信息,这可能吗?还是外键不是我要找的?

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?

是的。要在联系对象中为一件事提供多个电话号码,有两种方法 - 通过 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()

我希望这能澄清一点。

于 2012-04-21T06:41:29.577 回答