django模型与另一个模型的两个字段

时间:2015-06-30 08:48:03

标签: python django model foreign-keys

我正在创建模型类Car,我希望在其中有两个对一个外键的引用。

class Car(models.Model):
     owner = models.ForeignKey(User)
     #and here I want to have owner email (which is already set in class User)
     email = owner.email

但我不知道如何引用已经使用过的ForeignKey字段。 我收到这个错误:

  

AttributeError:type object' User'没有属性'电子邮件'

有什么办法吗?

3 个答案:

答案 0 :(得分:5)

这里有两件事......首先是找出你想要这样做的原因。因为也许你不应该这样做。

如果您只想从Car实例访问所有者的电子邮件地址,则无需将其添加为Car模型上的字段,您可以执行以下操作:

my_car = Car.objects.get(owner=me)
my_email = my_car.owner.email

这会执行两个单独的数据库查询,第一个获取Car,第二个获取拥有User时访问ForeignKey。

如果您想避免这种情况,可以使用select_related

my_car = Car.objects.select_related().get(owner=me)
my_email = my_car.owner.email

现在它只有一个查询,Django知道在底层SQL中进行连接。

但是,假设您知道这一切,并且您仍然希望将所有者的电子邮件添加到Car模型中。这称为'denormalisation',这可能是有效的性能原因。

出现的一个问题是如何在UserCar型号之间保持电子邮件地址同步。如果您故意在Django应用程序中进行非规范化,我强烈建议您考虑使用django-denorm。它在SQL db中安装触发器,并提供了一个很好的接口,用于在模型上指定非规范化字段。

答案 1 :(得分:1)

你应该真的关注django's tutorial ...

您可以使用car_instance.owner.email访问用户电子邮件。

答案 2 :(得分:1)

无需将现有字段添加到其他模块。原则上应避免重复数据。由于电子邮件和所有相关的用户信息都存在于用户模型中,因此外键足以访问与特定汽车记录相关的数据:

car = Car.objects.first()
email = car.owner.email

您可以对用户模型的任何字段执行相同操作。